tl; dr
LocalDate.of( 1985 , 1 , 1 )
…o…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Dettagli
I java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
le classi sono stati portati troppo in fretta quando Java lanciata e si è evoluta. Le classi non sono state ben progettate o implementate. Sono stati tentati miglioramenti, quindi le deprecazioni che hai trovato. Sfortunatamente, i tentativi di miglioramento fallirono ampiamente. Dovresti evitare del tutto queste classi . Sono sostituiti in Java 8 da nuove classi.
Problemi nel tuo codice
Un java.util.Date ha sia una data che una porzione di ora. Hai ignorato la parte temporale nel tuo codice. Quindi la classe Date prenderà l'inizio del giorno come definito dal fuso orario predefinito della tua JVM e applicherà quell'ora all'oggetto Date. Quindi i risultati del tuo codice varieranno a seconda della macchina che esegue o del fuso orario impostato. Probabilmente non quello che vuoi.
Se si desidera solo la data, senza la parte dell'ora, ad esempio per una data di nascita, è possibile che non si desideri utilizzare un Date
oggetto. Potresti voler memorizzare solo una stringa della data, nel formato ISO 8601 di YYYY-MM-DD
. Oppure usa un LocalDate
oggetto da Joda-Time (vedi sotto).
Joda-Time
Prima cosa da imparare in Java: evitare le notoriamente problematiche classi java.util.Date & java.util.Calendar in bundle con Java.
Come indicato correttamente nella risposta dall'utente3277382 , utilizzare Joda-Time o il nuovo pacchetto java.time. * In Java 8.
Codice di esempio in 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 );
Dump per 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 eseguito ...
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
In questo caso il codice per java.time è quasi identico a quello di Joda-Time .
Otteniamo un fuso orario ( ZoneId
) e costruiamo un oggetto data-ora assegnato a quel fuso orario ( ZonedDateTime
). Quindi, utilizzando il modello Immutable Objects , creiamo nuove date-time basate sullo stesso istante dell'oggetto vecchio (conteggio dei nanosecondi dal dall'epoca ) ma assegnato ad altro fuso orario. Infine otteniamo un LocalDate
orario che non ha né l'ora del giorno né il fuso orario, sebbene si noti che il fuso orario si applica quando si determina quella data (ad esempio un nuovo giorno sorge prima a Oslo che a New York ).
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();
Informazioni su java.time
The java.time framework è integrato in Java 8 e 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 java.time oggetti direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno 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 .