tl; dr
aconselhar as atuais "melhores práticas" em torno Date
eCalendar
É melhor sempre favorece Calendar
maisDate
Evite completamente essas classes herdadas . Use as classes java.time .
Detalhes
A resposta de Ortomala Lokni está certa ao sugerir o uso das classes modernas java.time em vez das classes antigas problemáticas de data e hora herdadas ( Date
,Calendar
, etc.). Mas essa resposta sugere a classe errada como equivalente (veja meu comentário sobre essa resposta).
Usando java.time
As classes java.time são uma grande melhoria em relação às classes de data e hora herdadas, diferença de noite e dia. As classes antigas são mal planejadas, confusas e problemáticas. Você deve evitar as aulas antigas sempre que possível. Mas quando você precisa converter de / para o antigo / novo, pode fazer isso chamando novos métodos para adicionar às classes antigas .
Para muito mais informações sobre conversão, consulte minha resposta e diagrama bacana para outra pergunta, converta java.util.Date para que tipo "java.time"? .
Pesquisando o estouro de pilha fornece muitas centenas de exemplos de perguntas e respostas sobre o uso de java.time. Mas aqui está uma rápida sinopse.
Instant
Obtenha o momento atual com um Instant
. A Instant
classe representa um momento na linha do tempo no UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).
Instant instant = Instant.now();
ZonedDateTime
Para ver o mesmo momento simultâneo pelas lentes do relógio de parede de uma região em particular , aplique um fuso horário ( ZoneId
) para obter a ZonedDateTime
.
Fuso horário
Especifique um nome próprio fuso horário no formato continent/region
, como America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. Nunca utilize o 3-4 letras, como EST
ou IST
como eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Deslocamento
Um fuso horário é o histórico de alterações de uma região em seu deslocamento em relação ao UTC . Mas às vezes você recebe apenas um deslocamento sem a zona completa. Nesse caso, use a OffsetDateTime
classe
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
O uso de um fuso horário é preferível ao uso de um mero deslocamento.
LocalDateTime
O "Local" nas Local…
classes significa qualquer localidade, não uma localidade específica. Portanto, o nome pode ser contra-intuitivo.
LocalDateTime
, LocalDate
E LocalTime
propositadamente não têm qualquer informação sobre a zona de deslocamento ou tempo. Assim, eles não representam momentos reais, eles são não pontos na linha do tempo. Em caso de dúvida ou confusão, use em ZonedDateTime
vez deLocalDateTime
. Procure Stack Overflow para muito mais discussão.
Cordas
Não confunda objetos de data e hora com seqüências de caracteres que representam seu valor. Você pode analisar uma sequência para obter um objeto de data e hora e pode gerar uma sequência a partir de um objeto de data e hora. Mas a string nunca é a própria data e hora.
Aprenda sobre os formatos padrão ISO 8601 , usados por padrão nas classes java.time.
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Usando um driver JDBC compatível com JDBC 4.2 ou posterior, você pode trocar objetos java.time diretamente com seu banco de dados. Não há necessidade de strings nem classes java.sql. *.
Onde obter as classes java.time?
- Java SE 8 , Java SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação em pacote configurável.
- O Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e Java SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
- Versões posteriores das implementações de pacote configurável do Android das classes java.time.
- Para anteriormente Android, o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .
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 .