In meinem Code muss ich alle meine Dinge finden, die heute passiert sind. Ich muss mich also mit Daten von heute um 00:00 Uhr (Mitternacht am frühen Morgen) bis 12:00 Uhr (Mitternacht heute Abend) vergleichen.
Ich weiß ...
Date today = new Date();
... holt mich jetzt. Und ...
Date beginning = new Date(0);
... bringt mir am 1. Januar 1970 keine Zeit. Aber was ist ein einfacher Weg, um heute null Zeit und morgen null Zeit zu bekommen?
AKTUALISIEREN; Ich habe das getan, aber es gibt doch einen einfacheren Weg?
Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();
Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .Antworten:
java.util.Calendar
JDK 8 - java.time.LocalTime und java.time.LocalDate
Joda-Zeit
Wenn Sie ein JDK <8 verwenden, empfehle ich Joda Time , da die API wirklich gut ist:
Seit der Version 2.3 von Joda Zeit
DateMidnight
ist veraltet , das so verwenden:Übergeben Sie eine Zeitzone, wenn Sie die aktuelle Standardzeitzone der JVM nicht möchten.
quelle
toDateMidnight
ist veraltet. Siehe diese Antwort für Details: stackoverflow.com/a/19048833/363573ZonedDateTime
) durchzuführen, wie Sie es im Abschnitt Joda-Time getan haben. DieLocal…
Typen haben keine Zeitzoneninformationen - das ist ihr gesamter Zweck, kein Verlust / Ignorieren aller Versatz- und Zeitzonendetails. Insbesondere wenn in der Frage über die Verwendung dieser Werte zum Vergleich gesprochen wird (möglicherweise Datenbankabfragen?), Ist ein in Zonen aufgeteilter Wert für Datum und Uhrzeit wahrscheinlich nützlicher.Der Vollständigkeit halber können Sie bei Verwendung von Java 8 auch die
truncatedTo
Methode derInstant
Klasse verwenden, um Mitternacht in UTC zu erhalten .Wie im Javadoc geschrieben
Ich hoffe es hilft.
quelle
Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
truncatedTo
undatStartOfDay
.Der einfachste Weg, um Mitternacht zu finden:
Nächster Tag:
quelle
Denken Sie daran,
Date
wird nicht verwendet, um Daten (!) Darzustellen. Zur Darstellung des Datums benötigen Sie einen Kalender. Dies:erstellt eine
Calendar
Instanz, die das aktuelle Datum in Ihrer aktuellen Zeitzone darstellt. Jetzt müssen Sie jedes Feld unterhalb des Tages (Stunde, Minute, Sekunde und Millisekunde) abschneiden, indem Sie es auf einstellen0
. Sie haben heute Mitternacht.Um am nächsten Tag Mitternacht zu bekommen, müssen Sie einen Tag hinzufügen:
Beachten Sie, dass das Hinzufügen von
86400
Sekunden oder 24 Stunden aufgrund der Sommerzeit, die in der Zwischenzeit auftreten kann, falsch ist.UPDATE: Meine bevorzugte Methode zur Lösung dieses Problems ist jedoch die Verwendung der DateUtils- Klasse von Commons Lang :
Es verwendet
Calendar
hinter den Kulissen ...quelle
Diese Methoden werden Ihnen helfen,
und
quelle
Ab JodaTime 2.3 ist das
toDateMidnight()
veraltet.Vom Upgrade von 2.2 auf 2.3
Hier ist ein Beispielcode ohne
toDateMidnight()
Methode.Code
Ausgabe ( kann je nach lokaler Zeitzone unterschiedlich sein )
quelle
DateTimeZone
Instanz an diesenDateTime
Konstruktor zu übergeben, um die Wichtigkeit der Angabe einer Zeitzone zu betonen, anstatt versehentlich abhängig von der Standardeinstellung:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
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 jedoch23: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 jedoch23: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:
… Denk so…
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 durchLocalDate
und zurück gehen,ZonedDateTime
wie Sie in diesem Beispielcode sehen können.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.
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 .quelle
java.time
Wenn Sie Java 8 und höher verwenden, können Sie das Paket java.time ( Tutorial ) ausprobieren :
quelle
Dies scheint eine Option zu sein:
um auch einen Tag hinzuzufügen
oder
Ich habe eine Ahnung, dass Letzteres bevorzugt wird, wenn etwas Seltsames wie Sommerzeit dazu führt, dass das Hinzufügen von 24 Stunden nicht ausreicht (siehe https://stackoverflow.com/a/4336131/32453 und seine anderen Antworten).
quelle
Ich habe das anders gemacht als alle anderen hier. Ich bin neu in Java, daher ist meine Lösung möglicherweise schlecht.
Ich bin mir noch nicht sicher, ob dies funktioniert, aber ich würde mich über jedes Feedback zu dieser Lösung freuen.
Ich bin verwirrt von der obigen Aussage, dass Sie morgen berechnen können, indem Sie anrufen:
Wenn Sie dem Tag des Monats 1 hinzufügen und es der 31. Tag ist, erhalten Sie dann nicht den 32. Tag des Monats?
Warum basieren Zeiten / Daten nicht alle auf UTC in Java? Ich würde denken, dass Zeitzonen nur benötigt werden sollten, wenn sie mit E / A verwendet werden, aber intern sollten sie immer in UTC verwendet werden. Die Klassen scheinen jedoch Zeitzoneninformationen zu enthalten, die nicht nur verschwenderisch, sondern auch anfällig für Codierungsfehler sind.
quelle
Apache Commons Lang
http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#isSameDay(java.util.Date , java.util.Date)
quelle
Der einfachste Weg mit JodaTime
DateMidnight date = DateMidnight.now();
quelle
00:00:00.000
. Verwenden Sie stattdessen die neuewithTimeAtStartOfDay
Methode. Aktualisieren Sie auf die aktuelle Version 2.4 von Joda-Time und lesen Sie die Versionshinweise. Beispiel:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Da ein Tag
24 * 60 * 60 * 1000
ms ist, kann die Mitternacht dieses Tages berechnet werden als ...quelle
So ziemlich wie die Antworten zuvor, aber niemand erwähnte den AM_PM-Parameter:
quelle
Calendar
Klasse wurde vor Jahren speziell durch die Klassen java.time ersetztZonedDateTime
.quelle
Date
Klasse wurde vor Jahren von verdrängtjava.time.Instant
. Vermeiden SieDate
heutzutage zu verwenden.Verwenden von Apache Commons.
quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .Ich weiß, dass dies ein sehr alter Beitrag ist. Ich dachte mein Wissen hier zu teilen!
Für das Datum Mitternacht heute mit genauer Zeitzone können Sie Folgendes verwenden
Wo
(1000*60 * 330)
subtrahiert wird, dh tatsächlich in Bezug auf die Zeitzone, zum Beispiel die indische Zeitzone, dh Kolkata, unterscheidet sich +5: 30 Stunden von der tatsächlichen. Subtrahieren Sie das also mit der Konvertierung in Millisekunden.Ändern Sie also die zuletzt abgezogene Zahl entsprechend Ihren Angaben. Ich erstelle ein Produkt, das nur in Indien ansässig ist. Ich habe also nur einen bestimmten Zeitstempel verwendet.
quelle
Aber Vorsicht, das
java.sql.Date.toInstant()
wirft immerUnsupportedOperationException
.Über LocalDate nach java.util.Date und umgekehrt einfachste Konvertierung?
quelle
Unmodern..
quelle
Date
.Date
Klasse ist immer in UTC. Sie ignorieren also das Problem der gewünschten / erwarteten Zeitzone. Zum Beispiel bricht in Kolkata Indien ein neuer Tag viele Stunden früher als in UTC und Stunden später als UTC in Montréal Québec an.