Joda-Zeit
Was das Hinzufügen einer Abhängigkeit betrifft, befürchte ich, dass java.util.Date & .Calendar wirklich so schlecht sind, dass ich bei jedem neuen Projekt als erstes die Joda-Time-Bibliothek hinzufüge. In Java 8 können Sie das neue Paket java.time verwenden, das von Joda-Time inspiriert ist.
Der Kern von Joda-Time ist die DateTime
Klasse. Im Gegensatz zu java.util.Date versteht es die zugewiesene Zeitzone ( DateTimeZone
). Weisen Sie beim Konvertieren von juDate eine Zone zu.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
Eine Möglichkeit zu überprüfen, ob zwei Datums- und Uhrzeitangaben am selben Datum landen, besteht in der Konvertierung in LocalDate
Objekte.
Diese Konvertierung hängt von der zugewiesenen Zeitzone ab. VergleichenLocalDate
Objekte können, müssen sie mit derselben Zone konvertiert worden sein.
Hier ist eine kleine Dienstprogrammmethode.
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
Besser wäre ein anderes Argument, die Zeitzone anzugeben, anstatt anzunehmen, dass die Zeitzone des ersten DateTime-Objekts verwendet werden sollte.
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
Zeichenfolgendarstellung
Ein anderer Ansatz besteht darin, eine Zeichenfolgendarstellung des Datumsabschnitts jeder Datums- / Uhrzeit zu erstellen und dann Zeichenfolgen zu vergleichen.
Auch hier ist die zugewiesene Zeitzone entscheidend.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
Zeitspanne
Die allgemeine Lösung besteht darin, eine Zeitspanne zu definieren und dann zu fragen, ob die Zeitspanne Ihr Ziel enthält. Dieser Beispielcode befindet sich in Joda-Time 2.4. Beachten Sie, dass die mit "Mitternacht" verbundenen Klassen veraltet sind. Verwenden Sie stattdessen die withTimeAtStartOfDay
Methode. Joda-Time bietet drei Klassen an, um eine Zeitspanne auf verschiedene Arten darzustellen: Intervall, Periode und Dauer.
Verwenden Sie den "Half-Open" -Ansatz, bei dem der Anfang der Spanne inklusive und das Ende exklusiv ist.
Die Zeitzone des Ziels kann sich von der Zeitzone des Intervalls unterscheiden.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8 und höher wird mit dem Java.time- Framework geliefert . Inspiriert von Joda-Time, definiert durch JSR 310 und erweitert durch das ThreeTen-Extra-Projekt. Siehe Tutorial .
Die Macher von Joda-Time haben uns alle angewiesen, so schnell wie möglich zu java.time zu wechseln. In der Zwischenzeit wird Joda-Time als aktiv gepflegtes Projekt fortgesetzt. Erwarten Sie jedoch, dass zukünftige Arbeiten nur in java.time und ThreeTen-Extra statt in Joda-Time ausgeführt werden.
Um java.time auf den Punkt zu bringen… An Instant
ist ein Moment auf der Timeline in UTC. Wenden Sie eine Zeitzone ( ZoneId
) an, um ein ZonedDateTime
Objekt zu erhalten. Um die Timeline losfahren, die vage unbestimmte Idee eines Datum-Zeit zu erhalten, verwenden Sie die „lokale“ Klassen: LocalDateTime
, LocalDate
, LocalTime
.
Die im Abschnitt Joda-Zeit dieser Antwort beschriebene Logik gilt für java.time.
Die alte Klasse java.util.Date verfügt über eine neue toInstant
Methode zur Konvertierung in java.time.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
Das Bestimmen eines Datums erfordert eine Zeitzone.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
Wir wenden dieses Zeitzonenobjekt auf das Instant
an, um a zu erhalten ZonedDateTime
. Daraus extrahieren wir einen Nur-Datum-Wert (a LocalDate
), da unser Ziel darin besteht, Daten (nicht Stunden, Minuten usw.) zu vergleichen.
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
Machen Sie dasselbe mit dem zweiten java.util.Date
Objekt, das wir zum Vergleich benötigen. Ich werde stattdessen nur den aktuellen Moment nutzen.
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
Verwenden Sie die spezielle isEqual
Methode, um auf denselben Datumswert zu testen.
Boolean sameDate = localDate1.isEqual( localDate2 );