tl; dr
LocalDate.of( 1985 , 1 , 1 )
…oder…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Einzelheiten
Die java.util.Date
, java.util.Calendar
und java.text.SimpleDateFormat
Klassen waren zu schnell gehetzt , wenn Java zum ersten Mal gestartet und weiterentwickelt. Die Klassen waren nicht gut gestaltet oder implementiert. Es wurden Verbesserungen versucht, daher die von Ihnen gefundenen Abwertungen. Leider sind die Verbesserungsversuche weitgehend gescheitert. Sie sollten diese Klassen insgesamt vermeiden . Sie werden in Java 8 durch neue Klassen ersetzt.
Probleme in Ihrem Code
Ein java.util.Date hat sowohl einen Datums- als auch einen Zeitabschnitt. Sie haben den Zeitanteil in Ihrem Code ignoriert. Die Date-Klasse nimmt also den Beginn des Tages, wie in der Standardzeitzone Ihrer JVM definiert, und wendet diese Zeit auf das Date-Objekt an. Die Ergebnisse Ihres Codes variieren also je nachdem, auf welchem Computer er ausgeführt wird oder welche Zeitzone eingestellt ist. Wahrscheinlich nicht was du willst.
Wenn Sie nur das Datum ohne Zeitangabe möchten, z. B. für ein Geburtsdatum, möchten Sie möglicherweise kein Date
Objekt verwenden. Möglicherweise möchten Sie nur eine Zeichenfolge des Datums im ISO 8601- Format von speichern YYYY-MM-DD
. Oder verwenden Sie ein LocalDate
Objekt aus Joda-Time (siehe unten).
Joda-Zeit
Das erste, was Sie in Java lernen sollten: Vermeiden Sie die notorisch lästigen Klassen java.util.Date & java.util.Calendar, die mit Java gebündelt sind.
Verwenden Sie , wie in der Antwort von user3277382 korrekt angegeben , entweder Joda-Time oder das neue Paket java.time. * In Java 8.
Beispielcode 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 );
Auf die Konsole werfen ...
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 );
Beim Laufen…
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 diesem Fall ist der Code für java.time fast identisch mit dem von Joda-Time .
Wir erhalten eine Zeitzone ( ZoneId
) und erstellen ein Datums- / Zeitobjekt, das dieser Zeitzone ( ZonedDateTime
) zugewiesen ist . Anschließend erstellen wir mithilfe des Musters " Unveränderliche Objekte" neue Datums- und Uhrzeitangaben basierend auf dem gleichen Zeitpunkt des alten Objekts (Anzahl der Nanosekunden seit der Epoche ), weisen jedoch eine andere Zeitzone zu. Zuletzt erhalten wir eine, LocalDate
die weder Tageszeit noch Zeitzone hat. Beachten Sie jedoch, dass die Zeitzone bei der Bestimmung dieses Datums gilt (ein neuer Tag bricht in Oslo früher an als beispielsweise in 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();
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .