tl; dr
LocalDate.of( 1985 , 1 , 1 )
…ou…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Detalhes
Os java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
as aulas foram correu muito rapidamente quando o Java primeiro lançado e evoluído. As aulas não foram bem projetadas ou implementadas. Melhorias foram tentadas, portanto, as reprovações que você encontrou. Infelizmente, as tentativas de melhoria falharam amplamente. Você deve evitar essas classes completamente. Eles são suplantados no Java 8 por novas classes.
Problemas no seu código
Um java.util.Date possui uma parte de data e hora. Você ignorou a parte do tempo no seu código. Portanto, a classe Date pegará o início do dia conforme definido pelo fuso horário padrão da sua JVM e aplicará esse horário ao objeto Date. Portanto, os resultados do seu código variam dependendo de qual máquina ele é executado ou de qual fuso horário está definido. Provavelmente não é o que você quer.
Se você deseja apenas a data, sem a parte da hora, como para uma data de nascimento, talvez não queira usar um Date
objeto. Convém armazenar apenas uma sequência da data, no formato ISO 8601 de YYYY-MM-DD
. Ou usar um LocalDate
objeto a partir de Joda-Time (veja abaixo).
Joda-Time
Primeira coisa a aprender em Java: Evite as classes notoriamente problemáticas java.util.Date e java.util.Calendar incluídas no Java.
Conforme observado corretamente na resposta do usuário3277382 , use o Joda-Time ou o novo pacote java.time. * No Java 8.
Exemplo de código no Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Despejar no console…
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Quando correr ...
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
Nesse caso, o código para java.time é quase idêntico ao do Joda-Time .
Obtemos um fuso horário ( ZoneId
) e construímos um objeto de data e hora atribuído a esse fuso horário ( ZonedDateTime
). Em seguida, usando o padrão Objetos imutáveis , criamos novas datas e horários com base no mesmo instante do objeto antigo (contagem de nanossegundos desde a época ), mas atribuímos outro fuso horário. Por fim, obtemos um LocalDate
que não possui hora do dia nem fuso horário, embora observe que o fuso horário se aplica ao determinar essa data (um novo dia começa mais cedo em Oslo do que em Nova York, por exemplo).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
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 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?
- Java SE 8 , Java SE 9 , Java SE 10 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 (<26), 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 .