Pergunta

Cada vez que eu preciso para trabalhar com data e / ou timstamps em Java Eu sempre sinto que estou fazendo algo errado e passar horas intermináveis ??tentando encontrar uma melhor maneira de trabalhar com as APIs sem ter que código meu próprio Data e classes de utilitários de tempo. Aqui está um par de coisas irritantes que apenas correu em:

  • meses 0-based. Eu percebo que a melhor prática é usar Calendar.SEPTEMBER em vez de 8, mas é irritante que 8 representa Setembro e não Agosto.

  • Conseguir uma data sem um timestamp. Eu sempre preciso o utilitário que Zeros fora a parte timestamp da data.

  • Eu sei que há outras questões que eu tive no passado, mas não consigo me lembrar. Sinta-se livre para adicionar mais em suas respostas.

Então, minha pergunta é ... O que APIs de terceiros que você usa para simplificar o uso de Data e manipulação Tempo de Java, se houver? Quaisquer pensamentos sobre utilizando Joda ? Qualquer pessoa olhou mais de perto a JSR-310 Data e API Time?

Foi útil?

Solução

Este post tem uma boa discussão sobre comparando o Data Java / Tempo API vs JODA.

Eu, pessoalmente, é só usar Calendário Gregoriano SimpleDateFormat qualquer momento eu preciso manipular datas / horas em Java. Eu realmente nunca tinha quaisquer problemas em usar a API Java e achar que é bastante fácil de usar, por isso não têm realmente olhou para quaisquer alternativas.

Outras dicas

java.time

Java 8 e posterior inclui agora a java.time quadro. Inspirado por Joda-Time , definido por JSR 310 , prorrogado pelo projeto ThreeTen-extra. Consulte o Tutorial .

Este quadro suplanta as velhas classes java.util.Date/.Calendar. métodos de conversão permitem que você converter para trás e para trabalhar com código antigo ainda não atualizada para os tipos java.time.

As classes principais são:

Este quadro resolve o par de problemas que você listou.

0 com base em meses

números

mês são 1-12 em java.time.

Mesmo melhor, um Enum ( Month ) fornece um exemplo para objeto cada mês do ano. Então você não precisa depender de números "mágicos" em seu código como 9 ou 10.

if ( theMonth.equals ( Month.OCTOBER ) ) {  …

Além disso, essa enumeração inclui alguns métodos utilitários úteis, tais como a obtenção de nome localizado de um mês.

Se ainda não estiver familiarizado com enums Java, leia a Tutorial e estudar-se. Eles são surpreendentemente acessível e poderosa.

A data sem uma hora

O LocalDate classe representa um valor de somente data, sem hora do dia, sem fuso horário.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

Note que a determinação de uma data requer um fuso horário. Um novo dia amanhece mais cedo em Paris do que em Montréal, onde ainda é ‘ontem’. O ZoneId classe representa um fuso horário.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

Da mesma forma, há um LocalTime classe para um dia de tempo-de-ainda não amarrado a uma zona de data ou hora.


Sobre java.time

O java.time quadro é construído em Java 8 e posterior. Essas classes suplantar o problemático idade legados aulas de data e hora, como java.util.Date , Calendar , e SimpleDateFormat .

O Joda-Time projeto, agora em modo de manutenção , aconselha migração para o java.time classes.

Para saber mais, consulte a a Oracle Tutorial . E busca Stack Overflow para muitos exemplos e explicações. Especificação é JSR 310 .

Onde obter as classes java.time?

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

O projeto Apache Commons Lang tem uma classe DateUtils que as operações executa útil data.

Eu uso DateUtils.truncate() muito, o que vai de "zero out" partes da data para você (útil se você quiser que o seu objeto Date para, digamos, representam uma data e não incluem qualquer informação de tempo). Cada método funciona tanto para Date e Calendar objetos também.

http://commons.apache.org/lang/

Estou usando Joda exclusivamente para três anos agora e definitivamente recomendo-lo - ele tem toda a área coberta com uma interface que 'faz o que diz'.

Joda pode olhar complexo quando você começa, como, por exemplo, tem conceitos de períodos, duração e intervalos que parecem tipo de semelhante, mas você pode começar simplesmente substituindo org.joda.time.DateTime (ou org.joda.time.DateMidnight) para java.util.Date no seu código, e ficar com muitos métodos úteis que essas classes contêm, antes de compreender as outras áreas.

Im usando GregorianCalendar - sempre e em toda parte. Simples java.util.Date é muito complexo, sim.

Então, meu conselho é - uso GC, a sua simples

É a mesma coisa em javascript. Alguém deve ter fumado alguma coisa quando eles acham que é uma boa idéia para deixar 2008 significa o ano de 2008, 31 de significar o dia 31 do mês, e - esta é a melhor parte -. 11 para significar o 12º mês

Por outro lado, chegaram à direita em dois dos três.

A coisa que sempre me deixa com Java é a biblioteca de tempo de data. Eu nunca usei Joda, olhar brevemente apenas para ele, parece que o seu uma boa implementação, e se eu entender JSR-130 corretamente seu conhecimento tomada de Joda e, eventualmente, tê-lo incluído no JavaSE.

Muitas vezes para projectos anteriores que eu envolveu os objetos de data e hora de Java, que em si foi uma tarefa bastante. Em seguida, usou os invólucros para manipulação de data.

APIs Data são muito difíceis de projetar, especialmente se eles têm de lidar com a localização. Tente rolar o seu próprio e ver, vale a pena fazer pelo menos uma vez. O fato de que Joda era capaz de fazer tal trabalho de um bom é um verdadeiro crédito para seus desenvolvedores. Para responder à sua pergunta, eu não ouvi nada mas coisas boas sobre essa biblioteca, embora eu nunca brinquei com ele mesmo.

Um monte de programadores começar usando Data, que tem vários construtores sobrecarregados obsoletas (tornando difícil a utilização), mas uma vez que você descobrir GregorianCalendar torna-se um pouco mais fácil de gerir. O exemplo aqui é muito útil:

http: //java.sun .com / J2SE / 1.4.2 / docs / api / java / util / GregorianCalendar.html

É realmente simples de escrever sua própria data API que fica no topo da matéria-Java aulas, Data e Calendário. Basicamente ambos data e calendário sofrem com o fato de que eles estão tentando empinar dois conceitos em uma classe:

  1. Data (ou seja, Ano-Mês-Dia)
  2. instantânea (ou seja currentTimeMillis)

Quando você entende isso, ela só vai revolucionar a forma como você lida com data-como conceitos em seu código. As coisas vão ser mais simples, mais claro, melhor. Em todos os sentidos!

Para mim, Joda é mais complicada, pelo menos para a esmagadora maioria dos fins e eu particularmente não gosto do fato de que eles têm ido contra as formas Java padrão, sendo um exemplo como eles analisar e formatar datas. Stephen Colebourne, o cara por trás JODA, é a liderança especificação da JSR-310 e este sofre dos mesmos problemas IMHO (Eu segui e contribuíram para as discussões nos últimos anos).

Faça você mesmo; é fácil. Basta preencher os seguintes classes: MyDate (embrulho ano-mês-dia), Month (uma enumeração), TimeOfDay (hora-mínimo-sec-millis), DayOfWeek (enum), Instant (envolvendo uma longa). Sempre considere fusos horários ao converter entre Instantes e datas.

Se isso parece assustador, você pode usar o Calendário e SimpleDateFormat sob o capô. Você vai fazer isso em um dia e nunca se arrepender.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top