Devo usar classes de data e hora em Java ou ir com uma biblioteca de terceiros como o Joda Time?

147

Estou criando um sistema baseado na Web que será usado em países de todo o mundo. Um tipo de dados que deve ser armazenado são datas e horas.

Quais são os prós e os contras de usar as classes de data e hora do Java em comparação com bibliotecas de terceiros, como a hora do Joda ? Acho que essas bibliotecas de terceiros existem por um bom motivo, mas eu nunca as comparei realmente.

JodaStephen
fonte
5
Para esclarecer alguns comentários ... Enquanto o Joda-Time continua, seu sucessor JSR 310: API de Data e Hora está realmente programado para fazer parte do Java 8 no pacote java.time . Oracle tem um rascunho de um tutorial . O JDBC 4.2 manipulará os novos tipos de dados.
Basil Bourque 28/10

Respostas:

197

EDIT: Agora que o Java 8 foi lançado, se você puder usá-lo, faça-o! java.timeé ainda mais limpo que o Joda Time, na minha opinião. No entanto, se você está preso antes do Java-8, continue lendo ...

Max pediu os prós e contras do uso de Joda ...

Prós:

  • Funciona muito bem. Eu suspeito fortemente que há muito menos erros no Joda do que nas bibliotecas Java padrão. Alguns dos erros nas bibliotecas Java são realmente difíceis (se não impossíveis) de corrigir devido ao design.
  • Ele foi projetado para incentivá-lo a pensar sobre o tratamento de data / hora da maneira correta - separando o conceito de "horário local" (por exemplo, "me acorde às 7h, onde quer que eu esteja") e um instante no tempo ("Estou ligando para James às 15:00 PST; pode não ser às 15:00 onde ele está, mas é o mesmo instante ")
  • Eu acredito que isso torna mais fácil para atualizar o banco de dados de fuso horário, o que faz mudança com relativa frequência
  • Tem uma boa história de imutabilidade, o que facilita muito a vida do IME.
  • À frente da imutabilidade, todos os formatadores são seguros para threads, o que é ótimo porque você quase sempre deseja reutilizar um único formatador através do aplicativo
  • Você terá um avanço no aprendizado java.timedo Java 8, pois eles são pelo menos um pouco semelhantes

Contras:

  • É outra API para aprender (embora os documentos sejam muito bons)
  • É outra biblioteca para construir e implantar
  • Quando você usa o Java 8, ainda há algum trabalho para migrar suas habilidades
  • Eu falhei em usar o DateTimeZoneBuilderefetivamente no passado. Este é um caso de uso muito raro.

Para responder à idéia de oxbow_lakes de criar efetivamente sua própria API pequena, aqui estão minhas opiniões sobre por que essa é uma péssima idéia:

  • Isso funciona. Por que trabalhar quando já foi feito para você?
  • É muito mais provável que um iniciante em sua equipe esteja familiarizado com Joda do que com sua API doméstica
  • É provável que você entenda errado algo além dos usos mais simples ... e mesmo que inicialmente ache que precisa apenas de funcionalidade simples, essas coisas costumam ficar mais complicadas, um pouquinho de cada vez. A manipulação de data e hora é difícil de fazer corretamente. Além disso, as APIs Java integradas são difíceis de usar adequadamente - basta olhar para as regras de funcionamento da aritmética de data / hora da API do calendário. Construir qualquer coisa além disso é uma má idéia, em vez de usar uma biblioteca bem projetada para começar.
Jon Skeet
fonte
5
@adi: Atualizado - é ainda válida, mas espero que JSR-310 fará parte do Java 8, mas não era parte do Java 7.
Jon Skeet
2
@JonSkeet Isso provavelmente deve ser atualizado desde a introdução do java-8
Sionnach733
@ Sionnach733: Não vou atualizar tudo isso, mas vou adicionar algo no início.
Jon Skeet
2
Existe um backport java.time.*para Java 6 e 7: threeten.org/threetenbp
Miscreant
24

Bem, a menos que você pretenda esperar pelo Java 8, esperando que eles implementem uma API melhor para manipular data e hora, sim, por favor, use o Joda-Time . Está economizando tempo e evita muitas dores de cabeça.

aparelho
fonte
Prós e contras? Eu nunca usei o tempo de Joda - seria interessante ouvir o que as pessoas gostam nele.
24320 Max Stewart
15

A resposta é: depende

JODA (e JSR-310) é uma biblioteca de data / hora totalmente funcional, incluindo suporte para uso com vários sistemas de calendário.

Pessoalmente, achei o JODA um passo longe demais em termos de complexidade para o que eu precisava. Os 2 erros principais (IMHO) no java Datee nas Calendarclasses padrão são:

  1. Eles são mutáveis
  2. Eles misturam o conceito de Ano-Mês-Dia a partir de um Instant-In-Time

Embora esses tópicos sejam abordados pelo JODA, você achará muito fácil rolar suas próprias classes para YearMonthDaye Instant, que usam as classes java sob o capô para cálculos "calendricais" reais. Então você não precisa se familiarizar com uma API de> 100 classes, um mecanismo de formatação / análise diferente etc.

Obviamente, se você precisa de uma representação completa de cronologias diferentes (por exemplo, hebraico) ou deseja poder definir seu próprio sistema imaginário de calendário (por exemplo, para um jogo que está escrevendo), talvez JODA ou JRS-310 seja para você. Se não, então eu sugeriria que rolar o seu próprio é possivelmente o caminho a percorrer.

O líder de especificação do JSR-310 é Stephen Colebourne, que escreveu o JODA em primeiro lugar, portanto substituirá logicamente o JODA.

oxbow_lakes
fonte
16
não deve ser reinventado por não especialistas, IMO.
31909 Jon Skeet
6
Também não sou idiota, mas ainda tenho problemas com as APIs Java D&T. Eles são dolorosamente fáceis de usar indevidamente. A razão pela qual as pessoas têm maior probabilidade de poder usar o Joda corretamente é que ele é melhor projetado - incentiva você a fazer a coisa certa.
31909 Jon Skeet
6
Confio em um especialista em mim mesmo em qualquer dia da semana, quando se trata de APIs de data / hora. Não é como se isso fosse uma API de terceiros aleatória sem ninguém mais usá-la. O argumento "> 100 classes" é um homem de palha, porque você obviamente não precisa aprender todas elas.
23909 Jon Skeet
5
Acho que teremos que concordar em diferir. Qualquer data / hora confiável, escrita por especialistas e bem projetada, que me evite ter que fazer um trabalho sujo com o tempo, conta como um "must have" do meu ponto de vista. No último ano, aprendi a odiar a medição do tempo humano com paixão.
26909 Jon Skeet
5
Rolar o seu próprio quando o Joda existe é uma idéia simplesmente terrível. Apenas não faça isso. É verdade que o Joda tem dezenas de aulas que você não vai usar, mas a resposta é simples: não use as que não precisa. Há muitas coisas que podem dar errado ao escrever sua própria biblioteca desse tipo - a quantidade de esforço que você precisará fazer é enorme, tanto no desenvolvimento quanto nos testes. Ou, você pode apenas adicionar uma biblioteca. Então, Joda tem o benefício adicional de que novos recrutas para sua equipe possam ter usado antes, mas eles não terão usado sua biblioteca local.
Dawood ibn Kareem
7

Tudo depende do que você está fazendo com as datas. Se você simplesmente persistir com eles, o Datas integradas do Java provavelmente fará tudo o que você deseja. No entanto, se você estiver manipulando extensivamente a data e hora, provavelmente estará melhor com Joda.

Anthony Roy
fonte
7

Você deve usar uma biblioteca Joda-Time, porque:

  1. O Joda-Time suporta o padrão ISO 8601 , que é uma representação padrão da maneira de
    data.
  2. Adicionar e subtrair um dia / mês / ano é mais fácil no Joda-Time do que java.util.date.
  3. Uma inicialização por uma data de entrega é muito mais fácil no Joda-Time.
  4. Joda-Time também suporta fuso horário.
  5. O Joda-Time possui uma análise interna melhor. Uma data errada como "31-02-2014" é lançada como um erro:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Você pode gostar desta página para obter mais detalhes: http://swcodes.blogspot.com/

Convidado
fonte