Andere Antworten sind korrekt, insbesondere die Antwort java.time von arganzheng . Wie bereits erwähnt, sollten Sie die alten Klassen java.util.Date/.Calendar vermeiden, da sie schlecht gestaltet, verwirrend und problematisch sind. Sie wurden durch die Klassen java.time ersetzt.
Lassen Sie mich Anmerkungen zur Strategie für den Umgang mit Mitternacht und Zeitspannen hinzufügen .
Halb offen
Bei der Arbeit mit Datum und Uhrzeit werden Zeitspannen häufig mithilfe des „Half-Open“ -Ansatzes definiert. Bei diesem Ansatz ist der Anfang inklusive, während das Ende exklusiv ist . Dies löst Probleme und erleichtert bei konsequenter Verwendung das Nachdenken über Ihre Datums- und Uhrzeitbehandlung erheblich.
Ein gelöstes Problem ist die Definition des Tagesendes. Ist der letzte Moment des Tages 23:59:59.999
( Millisekunden )? Vielleicht in der Klasse java.util.Date (vom frühesten Java; mühsam - vermeiden Sie diese Klasse!) Und in der äußerst erfolgreichen Joda-Time- Bibliothek. In anderen Programmen wie Datenbanken wie Postgres ist der letzte Moment jedoch 23:59:59.999999
( Mikrosekunden ). In anderer Software wie dem java.time- Framework (integriert in Java 8 und höher, Nachfolger von Joda-Time) und in einigen Datenbanken wie der H2-Datenbank kann der letzte Moment jedoch 23:59.59.999999999
( Nanosekunden ) sein. Anstatt Haare zu spalten, denken Sie nur an den ersten Moment, nicht an den letzten Moment.
Bei Half-Open läuft ein Tag vom ersten Moment eines Tages bis zum ersten Moment des folgenden Tages , schließt ihn jedoch nicht ein . Also anstatt so zu denken:
… Von heute um 00:00 Uhr (Mitternacht heute früh) bis 12:00 Uhr (Mitternacht heute Abend).
… Denk so…
vom ersten Moment des heutigen Tages bis zum ersten Moment von morgen:
(> = 00:00:00.0
heute UND < 00:00:00.0
morgen)
In der Datenbank arbeiten, bedeutet dieser Ansatz nicht die Verwendung von BETWEEN
Operator in SQL.
Tagesanfang
Darüber hinaus ist der erste Moment des Tages nicht immer die Tageszeit 00:00:00.0
. Sommerzeit (DST) in einigen Zeitzonen und möglicherweise andere Anomalien können bedeuten, dass eine andere Zeit den Tag beginnt.
Lassen Sie also die Klassen java.time den Beginn eines Tages mit einem Aufruf von bestimmen LocalDate::atStartOfDay( ZoneId )
. Wir müssen also durch LocalDate
und zurück gehen, ZonedDateTime
wie Sie in diesem Beispielcode sehen können.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Beachten Sie die Übergabe des optionalen ZoneId
. Wenn nicht angegeben, wird die aktuelle Standardzeitzone Ihrer JVM implizit angewendet. Besser explizit sein.
Die Zeitzone ist für die Arbeit mit Datum und Uhrzeit von entscheidender Bedeutung. Die Frage und einige andere Antworten sind möglicherweise fehlerhaft, da die Zeitzone nicht bewusst behandelt wird.
Konvertieren
Wenn Sie müssen eine java.util.Date oder .Calendar verwenden, suchen Sie nach Methoden , um neue Umstellung auf die alten Klassen hinzugefügt.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Zeitspanne
Übrigens, wenn Sie viel mit Zeitspannen arbeiten, schauen Sie sich Folgendes an:
Duration
Period
Interval
Die Interval
Klasse befindet sich im ThreeTen-Extra- Projekt, einer Erweiterung des Java.time-Frameworks. Dieses Projekt ist das Testfeld für mögliche zukünftige Ergänzungen von java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.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
.
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 .