tl; dr
LocalDate.of( 2014 , 2 , 11 )
Se você insiste em usar a terrível java.util.Date
classe velha , converta das classes java.time modernas .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Detalhes
Se você quiser "fácil", deve usar o novo pacote java.time no Java 8 em vez das classes notoriamente problemáticas java.util.Date & .Calendar empacotadas com Java.
java.time
A estrutura java.time construída no Java 8 e posterior suplanta as antigas classes java.util.Date/.Calendar problemáticas.
Somente data
Uma LocalDate
classe é oferecida por java.time para representar um valor apenas de data sem qualquer hora do dia ou fuso horário. Você precisa de um fuso horário para determinar uma data, já que um novo dia amanhece mais cedo em Paris do que em Montreal, por exemplo. A ZoneId
aula é para fusos horários.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Despejar para o console:
System.out.println ( "today: " + today + " in zone: " + zoneId );
hoje: 26/11/2015 na zona: Ásia / Cingapura
Ou use um método de fábrica para especificar o ano, mês, dia.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localData: 11/02/2014
Ou passe um número de mês de 1 a 12 em vez de um DayOfWeek
objeto enum.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Fuso horário
A LocalDate
não tem significado real até que você o ajuste em um fuso horário. Em java.time, aplicamos um fuso horário para gerar um ZonedDateTime
objeto. Isso também significa uma hora do dia, mas a que horas? Normalmente faz sentido ir com o primeiro momento do dia. Você pode pensar que significa a hora 00:00:00.000
, mas nem sempre é verdade por causa do horário de verão (DST) e talvez outras anomalias. Em vez de presumir essa hora, pedimos a java.time para determinar o primeiro momento do dia chamando atStartOfDay
.
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 zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Ásia / Cingapura]
UTC
Para trabalho de back-end (lógica de negócios, banco de dados, armazenamento e troca de dados), geralmente usamos o fuso horário UTC . Em java.time, a Instant
classe representa um momento na linha do tempo em UTC. Um objeto Instant pode ser extraído de um ZonedDateTime chamando toInstant
.
Instant instant = zdt.toInstant();
instantâneo: 2014-02-10T16: 00: 00Z
Converter
Você deve evitar usar java.util.Date
classes inteiramente. Mas se você deve interoperar com o código antigo ainda não atualizado para java.time , você pode converter e para trás. Procure novos métodos de conversão adicionados às classes antigas.
java.util.Date d = java.util.from( instant ) ;
…e…
Instant instant = d.toInstant() ;
Sobre java.time
A estrutura java.time é construída em Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
Para saber mais, consulte o Tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
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 cordas, não há necessidade de java.sql.*
classes. Hibernate 5 e JPA 2.2 suportam java.time .
Onde obter as classes java.time?
ATUALIZAÇÃO: A biblioteca Joda-Time agora está em modo de manutenção e recomenda a migração para as classes java.time . Estou deixando esta seção para história.
Joda-Time
Por um lado, Joda-Time usa uma numeração sensata, mas fevereiro 2
não 1
. Outra coisa, um Joda-Time DateTime realmente conhece seu fuso horário atribuído, ao contrário de java.util.Date que parece ter fuso horário, mas não tem.
E não se esqueça do fuso horário. Caso contrário, você obterá o padrão do JVM.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Despejar para console ...
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Quando executado ...
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
Conversão
Se você precisar converter para java.util.Date para usar com outras classes…
java.util.Date date = dateTimeSingapore.toDate();