tl; dr
... analizzato ... da una stringa ... il fuso orario non è specificato ... Voglio impostare un fuso orario specifico
LocalDateTime.parse( "2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.
Nessun fuso orario in data juDate
Come indicato nelle altre risposte corrette, un java.util.Date non ha fuso orario † . Rappresenta UTC / GMT (nessun offset del fuso orario). Molto confuso perché il suo toString
metodo applica il fuso orario predefinito della JVM durante la generazione di una rappresentazione String.
Evita il juDate
Per questo e molti altri motivi, dovresti evitare di usare java.util.Date & .Calendar & java.text.SimpleDateFormat integrati. Sono notoriamente fastidiosi.
Utilizzare invece il pacchetto java.time in bundle con Java 8 .
java.time
Le classi java.time possono rappresentare un momento sulla sequenza temporale in tre modi:
- UTC (
Instant
)
- Con un offset (
OffsetDateTime
con ZoneOffset
)
- Con un fuso orario (
ZonedDateTime
con ZoneId
)
Instant
In java.time , il blocco predefinito di base è Instant
un momento sulla linea temporale in UTC. Usa gli Instant
oggetti per gran parte della tua logica aziendale.
Instant instant = Instant.now();
OffsetDateTime
Applicare un offset da UTC per regolare l' ora dell'orologio a muro di alcune località .
Applicare a ZoneOffset
per ottenere un OffsetDateTime
.
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );
ZonedDateTime
È meglio applicare un fuso orario , un offset più le regole per la gestione di anomalie come l' ora legale (DST) .
Applicare a ZoneId
a Instant
per ottenere a ZonedDateTime
. Specificare sempre un nome di fuso orario corretto . Non utilizzare mai 3-4 abbreviazioni come EST
o IST
che non sono né uniche né standardizzate.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
Se la stringa di input mancava di qualsiasi indicatore di offset o zona, analizzarla come a LocalDateTime
.
Se si è certi del fuso orario previsto, assegnare a ZoneId
per produrre a ZonedDateTime
. Vedi l'esempio di codice sopra nella sezione tl; dr in alto.
Stringhe formattate
Chiamare il toString
metodo su una di queste tre classi per generare una stringa che rappresenta il valore data-ora nel formato ISO 8601 standard . La ZonedDateTime
classe estende il formato standard aggiungendo il nome del fuso orario tra parentesi.
String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]
Per altri formati usa la DateTimeFormatter
classe. Generalmente è meglio lasciare che quella classe generi formati localizzati usando il linguaggio umano atteso dall'utente e le norme culturali. Oppure puoi specificare un formato particolare.
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
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Joda-Time
Mentre Joda-Time è ancora attivamente mantenuto, i suoi produttori ci hanno detto di migrare su java.time non appena è conveniente. Lascio intatta questa sezione come riferimento, ma suggerisco invece di utilizzare la java.time
sezione precedente.
In Joda-Time , un oggetto data-ora ( DateTime
) conosce veramente il fuso orario assegnato. Ciò significa un offset rispetto a UTC e le regole e la cronologia dell'ora legale (DST) di quel fuso orario e altre anomalie simili.
String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );
Chiamare il toString
metodo per generare una stringa in formato ISO 8601 .
String output = dateTimeIndia.toString();
Joda-Time offre anche funzionalità avanzate per la generazione di tutti i tipi di altri formati di stringa.
Se necessario, è possibile convertire da Joda-Time DateTime a java.util.Date.
Java.util.Date date = dateTimeIndia.toDate();
Cerca StackOverflow per "data joda" per trovare molti altri esempi, alcuni abbastanza dettagliati.
† In realtà non è un fuso orario incorporato in un java.util.Date, usato per alcune funzioni interne (vedi commenti su questa risposta). Ma questo fuso orario interno non è esposto come proprietà e non può essere impostato. Questo fuso orario interno non è quello utilizzato dal toString
metodo per generare una rappresentazione in formato stringa del valore data-ora; invece l'attuale fuso orario predefinito della JVM viene applicato al volo. Quindi, come abbreviazione, spesso diciamo che "juDate non ha fuso orario". Confondere? Sì. Ancora un altro motivo per evitare queste vecchie classi stanche.