tl; dr
LocalDate.of( 2014 , 2 , 11 )
Wenn Sie darauf bestehen, die schreckliche alte java.util.Date
Klasse zu verwenden, konvertieren Sie von den modernen java.time- Klassen.
java.util.Date // Terrible old legacy class, avoid using. Represents a moment in UTC.
.from( // New conversion method added to old classes for converting between legacy classes and modern classes.
LocalDate // Represents a date-only value, without time-of-day and without time zone.
.of( 2014 , 2 , 11 ) // Specify year-month-day. Notice sane counting, unlike legacy classes: 2014 means year 2014, 1-12 for Jan-Dec.
.atStartOfDay( // Let java.time determine first moment of the day. May *not* start at 00:00:00 because of anomalies such as Daylight Saving Time (DST).
ZoneId.of( "Africa/Tunis" ) // Specify time zone as `Continent/Region`, never the 3-4 letter pseudo-zones like `PST`, `EST`, or `IST`.
) // Returns a `ZonedDateTime`.
.toInstant() // Adjust from zone to UTC. Returns a `Instant` object, always in UTC by definition.
) // Returns a legacy `java.util.Date` object. Beware of possible data-loss as any microseconds or nanoseconds in the `Instant` are truncated to milliseconds in this `Date` object.
Einzelheiten
Wenn Sie "einfach" möchten, sollten Sie das neue Paket java.time verwenden in Java 8 verwenden und nicht die notorisch problematischen Klassen java.util.Date & .Calendar, die mit Java gebündelt sind.
java.time
Die java.time in Java 8 und höher integrierte Framework ersetzt die problematischen alten Klassen java.util.Date/.Calendar.
Nur Datum
LocalDate
Von java.time wird eine Klasse angeboten, die einen Nur-Datum-Wert ohne Tageszeit oder Zeitzone darstellt. Sie benötigen eine Zeitzone, um ein Datum zu bestimmen, da in Paris ein neuer Tag früher beginnt als beispielsweise in Montréal. Die ZoneId
Klasse ist für Zeitzonen.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
Dump zur Konsole:
System.out.println ( "today: " + today + " in zone: " + zoneId );
heute: 26.11.2015 in Zone: Asien / Singapur
Oder verwenden Sie eine Factory-Methode, um Jahr, Monat und Tag anzugeben.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 11.02.2014
Oder übergeben Sie eine Monatsnummer 1-12 anstelle eines DayOfWeek
Aufzählungsobjekts.
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
Zeitzone
A LocalDate
hat keine wirkliche Bedeutung, bis Sie es in eine Zeitzone einstellen. In java.time wenden wir eine Zeitzone an, um ein ZonedDateTime
Objekt zu generieren . Das bedeutet auch eine Tageszeit, aber zu welcher Zeit? Normalerweise macht es Sinn, mit dem ersten Moment des Tages zu gehen. Sie könnten denken, dass dies die Zeit bedeutet 00:00:00.000
, aber aufgrund der Sommerzeit (DST) und möglicherweise anderer Anomalien nicht immer wahr ist. Anstatt diese Zeit anzunehmen, bitten wir java.time, den ersten Moment des Tages durch einen Anruf zu bestimmen atStartOfDay
.
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben, da EST
oder IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [Asien / Singapur]
koordinierte Weltzeit
Für Back-End-Arbeiten (Geschäftslogik, Datenbank, Datenspeicherung und -austausch) verwenden wir normalerweise die UTC- Zeitzone. In java.time Instant
repräsentiert die Klasse einen Moment auf der Zeitachse in UTC. Ein Instant-Objekt kann durch Aufrufen aus einer ZonedDateTime extrahiert werden toInstant
.
Instant instant = zdt.toInstant();
Augenblick: 2014-02-10T16: 00: 00Z
Konvertieren
Sie sollten die Verwendung von java.util.Date
class vollständig vermeiden . Wenn Sie jedoch mit altem Code zusammenarbeiten müssen, der für java.time noch nicht aktualisiert wurde , können Sie hin und her konvertieren. Suchen Sie nach neuen Konvertierungsmethoden, die zu den alten Klassen hinzugefügt wurden.
java.util.Date d = java.util.from( instant ) ;
…und…
Instant instant = d.toInstant() ;
Ü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
.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
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. Hibernate 5 und JPA 2.2 unterstützen java.time .
Woher bekomme ich die java.time-Klassen?
UPDATE: Die Joda-Time- Bibliothek befindet sich jetzt im Wartungsmodus und empfiehlt die Migration zu den Klassen java.time . Ich lasse diesen Abschnitt für die Geschichte an Ort und Stelle.
Joda-Zeit
Zum einen verwendet Joda-Time eine sinnvolle Nummerierung, der Februar also 2
nicht 1
. Eine andere Sache, eine Joda-Time DateTime kennt die zugewiesene Zeitzone wirklich, im Gegensatz zu einer java.util.Date, die eine Zeitzone zu haben scheint, dies aber nicht tut.
Und vergessen Sie nicht die Zeitzone. Andernfalls erhalten Sie die Standardeinstellung der 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" ); // Language: Bahasa Melayu (?). Country: Singapore.
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
Auf die Konsole werfen ...
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
Beim Laufen…
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
Umwandlung
Wenn Sie zur Verwendung mit anderen Klassen in ein java.util.Date konvertieren müssen…
java.util.Date date = dateTimeSingapore.toDate();