tl; dr
LocalDate.of( 2014 , 2 , 11 )
Se insisti nell'usare la terribile vecchia java.util.Date
classe, converti dalle moderne classi java.time .
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
Dettagli
Se vuoi "facile", dovresti usare il nuovo pacchetto java.time in Java 8 invece delle notoriamente fastidiose classi java.util.Date e .Calendar in bundle con Java.
java.time
Il framework java.time integrato in Java 8 e versioni successive sostituisce le vecchie e problematiche classi java.util.Date/.Calendar.
Solo data
Una LocalDate
classe è offerta da java.time per rappresentare un valore di sola data senza alcuna ora del giorno o fuso orario. Hai bisogno di un fuso orario per determinare una data, poiché un nuovo giorno sorge prima a Parigi che a Montréal, ad esempio. La ZoneId
classe è per i fusi orari.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Scarica su console:
System.out.println ( "today: " + today + " in zone: " + zoneId );
oggi: 2015-11-26 nella zona: Asia / Singapore
Oppure utilizzare un metodo di fabbrica per specificare l'anno, il mese, il giorno.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 2014-02-11
Oppure passa un mese numero 1-12 anziché un DayOfWeek
oggetto enum.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Fuso orario
A LocalDate
non ha alcun significato reale fino a quando non lo si regola in un fuso orario. In java.time, applichiamo un fuso orario per generare un ZonedDateTime
oggetto. Ciò significa anche un'ora del giorno, ma a che ora? Di solito ha senso andare con il primo momento della giornata. Potresti pensare che significhi l'ora 00:00:00.000
, ma non sempre è vero a causa dell'ora legale (DST) e forse di altre anomalie. Invece di supporre quell'ora, chiediamo a java.time di determinare il primo momento della giornata chiamando atStartOfDay
.
Specificare un nome proprio fuso orario nel formato continent/region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non usare mai il 3-4 lettera sigla come ad esempio EST
o IST
come sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Asia / Singapore]
UTC
Per il lavoro di back-end (logica aziendale, database, archiviazione e scambio di dati) usiamo solitamente il fuso orario UTC . In java.time, la Instant
classe rappresenta un momento sulla timeline in UTC. Un oggetto Instant può essere estratto da un ZonedDateTime chiamando toInstant
.
Instant instant = zdt.toInstant();
istantaneo: 2014-02-10T16: 00: 00Z
Convertire
Dovresti evitare di usare java.util.Date
completamente la classe. Ma se devi interagire con il vecchio codice non ancora aggiornato per java.time , puoi eseguire la conversione avanti e indietro. Cerca nuovi metodi di conversione aggiunti alle vecchie classi.
java.util.Date d = java.util.from( instant ) ;
…e…
Instant instant = d.toInstant() ;
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi. Hibernate 5 e JPA 2.2 supportano java.time .
Dove ottenere le classi java.time?
AGGIORNAMENTO: La libreria Joda-Time è ora in modalità di manutenzione e consiglia la migrazione alle classi java.time . Lascio questa sezione per la storia.
Joda-Time
Per prima cosa, Joda-Time utilizza una numerazione ragionevole, quindi febbraio 2
non lo è 1
. Un'altra cosa, un Joda-Time DateTime conosce veramente il fuso orario assegnato a differenza di un java.util.Date che sembra avere un fuso orario ma non lo fa.
E non dimenticare il fuso orario. Altrimenti otterrai l'impostazione predefinita della 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 );
Scarica su console ...
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Quando corri ...
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
Conversione
Se è necessario convertire in un java.util.Date per l'uso con altre classi ...
java.util.Date date = dateTimeSingapore.toDate();