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 toStringmetodo 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 (
OffsetDateTimecon ZoneOffset)
- Con un fuso orario (
ZonedDateTimecon ZoneId)
Instant
In java.time , il blocco predefinito di base è Instantun momento sulla linea temporale in UTC. Usa gli Instantoggetti 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 ZoneOffsetper 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 ZoneIda Instantper ottenere a ZonedDateTime. Specificare sempre un nome di fuso orario corretto . Non utilizzare mai 3-4 abbreviazioni come ESTo ISTche 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 ZoneIdper produrre a ZonedDateTime. Vedi l'esempio di codice sopra nella sezione tl; dr in alto.
Stringhe formattate
Chiamare il toStringmetodo su una di queste tre classi per generare una stringa che rappresenta il valore data-ora nel formato ISO 8601 standard . La ZonedDateTimeclasse 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 DateTimeFormatterclasse. 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, YearQuartere 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.timesezione 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 toStringmetodo 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 toStringmetodo 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.