Java Time vs Joda Time

19

Embora o Joda seja rico em recursos e mais sofisticado que o tempo padrão do Java, nem sempre é a melhor coisa a se usar. Como decido se devo usar o Joda Time ou Java Time em qualquer código Java?

Existe algum tipo de orientação que nos diz como escolher a correta, dependendo de nossos requisitos?

cavaleiro Jedi
fonte
5
Obtenha o melhor dos dois mundos, usando a nova API de data e hora incluída no Java 8 . É fortemente influenciado pelo Joda Time. De fato, o autor principal é Stephen Colebourne, o autor de Joda Time.
Joachim Sauer
1
@JoachimSauer Ele apareceu em uma versão final ou isso acontecerá quando o Java 8 for lançado?
M3th0dman
@ m3th0dman: será incluído na versão final do Java 8, ainda não foi lançado. O GA está programado para 09/09/2013 .
Joachim Sauer
O Joda-Time e as classes de data e hora originais do Java agora estão fora de moda pelas classes java.time incorporadas no Java 8, Java 9 e posterior.
Basil Bourque

Respostas:

29

O Joda Time é uma melhoria tão grande na biblioteca de tempos Java que quase sempre é a escolha certa, exceto pelas seguintes exceções:

  1. Quando é difícil ou indesejável adicionar dependências de terceiros ao seu projeto

  2. Quando seu uso em uma interface pública causaria problemas, por exemplo, obter um ORM para manipular os campos de tempo java e Joda

No entanto, no caso de 2), ainda seria melhor usar o Joda internamente, se possível.

Vale a pena lembrar das coisas acima, mas deve ser raro. Em caso de dúvida, vá com Joda.

Robert Johnson
fonte
Por favor, diga-me o que significa "usar Joda internamente". Sou iniciante e não sei todas essas coisas.
Jedi Knight
5
@Jedi Knight: significa que o aplicativo usa Joda por sua própria lógica e só converte de / para java.util.Date quando se comunica com um sistema externo que exige isso.
Michael Borgwardt
2
Por 'interno', poderia ser interno ao aplicativo como um todo (como no exemplo de Michael), mas poderia ser interno a uma classe ou apenas a um método específico. Diga, por exemplo, que você possui um método utilitário que utiliza dois objetos Java Date e calcula o número de dias úteis entre eles, mas contém um erro. Para corrigi-lo, pode muito bem ser mais fácil reescrever esse método usando o JodaTime, mas talvez você não tenha tempo para refatorar todo o código que chama o método, para deixar a assinatura do método inalterada. Nesse caso, você está usando Joda "internamente" nesse método.
22413 Robert Johnson
Para sua informação, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque
13

Observe que no site da Joda-Time ele afirma:

As classes de data e hora padrão anteriores ao Java SE 8 são ruins. Ao enfrentar esse problema de frente, o Joda-Time se tornou a biblioteca padrão de data e hora padrão para Java. Observe que, a partir do Java SE 8, os usuários são solicitados a migrar para o java.time (JSR-310).

O principal colaborador do Joda-Time , jodastephen , também é o principal colaborador do JSR-310, como pode ser visto no repositório do GitHub associado a http://www.threeten.org/ . By the way, jodastephen também tem um identificador de SO ...

Eu acho que é seguro afirmar que podemos nos sentir confortáveis ​​e seguros com a nova API de data e hora, conforme fornecido no Java 8 em diante.

Algumas referências adicionais:

YoYo
fonte
12

A API de data padrão do Java é tão fundamentalmente quebrada que eu considerei simplesmente adicionar o Joda Time às extensões de biblioteca da JVM para carregá-lo no caminho de classe por padrão com o restante da API do Java.

Se você já foi encarregado de adaptar a internacionalização e os fusos horários em um aplicativo Java herdado e tentou usar a API Java padrão sozinho, entenderá o que quero dizer. Consegui transformar milhares de linhas de código asininas em menos de cem. O aumento da produtividade é inconcebível.

Além disso, a API Date padrão não é intuitiva, onde a API Joda fluida pode ser capturada em horas, não em semanas. Sua analogia de tentar chegar à ilha que fica a três quilômetros de distância é mais parecida com a seguinte.

1) Uma lancha que o levará à ilha em apenas 6 minutos.

Ou...

2) Uma jangada improvisada de bambu amarrada com trepadeiras durante um furacão dirigido por um maluco cujo melhor amigo é o vôlei.

Como outras respostas declararam, as poucas desvantagens, como o ORM, estão se tornando inexistentes, pois o Hibernate agora possui plug-ins que permitem mapear as propriedades do bean do tipo Joda para os campos de data / hora do banco de dados. A JPA também pode ter uma resposta para isso.

Se você deseja que seu aplicativo tenha uma pegada minimalista como um aplicativo de desktop no que diz respeito ao espaço em disco, talvez o Java nem seja a escolha certa da linguagem.

maple_shaft
fonte
Para sua informação, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque
8

Mais um ponto: Java-Time (ie Date) não é ThreadSafe, mas JodaTime. Portanto, o JodaTime é preferido quando requisitos como

  • Ambiente MultiThreaded acessando os recursos comuns
  • Sincronização de tempo centralizada como situações

Ou então, para aplicativos simples, o Java-Time é bom.

vintesh
fonte
Mesmo DateTime também não é ThreadSafe, não é? Corrija-me se eu estiver errado.
vintesh
3
A grande maioria da biblioteca Joda, incluindo a classe DateTime, é imutável e, portanto, segura para threads. No entanto, existem algumas classes mutáveis ​​que não são seguras para threads. Consulte joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
A segurança da linha java.timeé implementada através da imutabilidade. Consulte stackoverflow.com/questions/9303532/… . Isso funciona bem para aplicativos simples e complexos. Até o documento api afirma que "Todas as classes são imutáveis ​​e seguras para threads" (literalmente citadas no segundo parágrafo). As java.utilclasses antigas , por outro lado, têm vários problemas. Sei que esta resposta se refere a esta última, mas importante fazer essa distinção agora.
YoYo 29/05
Não representar data e hora como valores imutáveis ​​é simplesmente insano. Eu sei que foi corrigido agora, mas realmente o que eles estavam pensando?
Aluan Haddad
2

A estrutura java.time substitui as classes de data e hora herdadas e o Joda-Time

Atualização: As antigas classes de data e hora fornecidas com as versões mais antigas do Java agora são herdadas, oficialmente suplantadas pelas classes java.time incorporadas no Java 8, Java 9 e posterior.

Date, Calendar, SimpleDateFormat, E as java.sql.*aulas de data e hora todos devem ser evitados. Nunca é necessário usar essas classes confusas, problemáticas e mal projetadas. Eles são totalmente substituídos pelas classes java.time. Seu único objetivo agora é manter o código antigo existente. Ao fazer interface com o código antigo, você pode converter de / para java.time chamando novos métodos adicionados às classes antigas. Para obter mais informações sobre a conversão, consulte: Converter java.util.Date para que tipo "java.time"? .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time . O projeto Joda-Time inspirou a estrutura java.time. Ambos são liderados pelo mesmo homem, Stephen Colebourne . Você pode pensar em java.time como uma reescrita / reformulação do Joda-Time, um código totalmente novo, mas usando o que foi aprendido ao longo dos anos ao criar a primeira biblioteca de data e hora abrangente e sofisticada do setor.

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações.

Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport e adaptada ainda mais ao Android no ThreeTenABP (consulte Como usar ... ).

O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte