Ich habe ein Java-Datumsobjekt mit Datums- und Uhrzeitinformationen. Ich möchte eine Methode schreiben, die die Zeitinformationen abschneidet, die Stunden-Minuten-Sekunden abschneidet, sodass nur noch das Datum übrig ist.
Beispieleingabe:
2008-01-01 13:15:00
Erwartete Ausgabe:
2008-01-01 00:00:00
Hast du einen tipp Ich habe versucht, so etwas zu tun:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
aber ich hatte Probleme mit der Zeitzone.
java.util.Calendar
jetzt Legacy sind , werden durch die Klassen java.time ersetzt . Siehe Tutorial von Oracle .Haben Sie sich die Methode zum Abschneiden von DateUtils in Apache Commons Lang angesehen?
entfernt das Zeitelement.
quelle
Hast du Joda angeschaut ? Es ist eine viel einfachere und intuitivere Möglichkeit, mit Datum und Uhrzeit zu arbeiten. Zum Beispiel können Sie trivial zwischen (sagen wir) LocalDateTime- und LocalDate- Objekten konvertieren .
zB (zur Veranschaulichung der API)
Darüber hinaus werden einige Probleme mit der Thread-Sicherheit mit Datums- / Zeitformatierern behoben und es wird dringend empfohlen, mit Datums- / Uhrzeitproblemen in Java zu arbeiten.
quelle
Nur ein kurzes Update angesichts der java.time- Klassen, die jetzt in Java 8 und höher integriert sind.
LocalDateTime
hat einetruncatedTo
Methode, die effektiv auf das eingeht, worüber Sie hier sprechen:Dies drückt die aktuelle Zeit nur auf Minuten aus:
Sie können ein
ChronoUnit
(oder einTemporalUnit
) kleiner als DAYS verwenden, um die Kürzung auszuführen (da die Kürzung nur auf den Zeitteil von LocalDateTime angewendet wird, nicht auf den Datumsteil).quelle
quelle
Mit Joda können Sie leicht das erwartete Datum erhalten.
Ab Version 2.7 (möglicherweise seit einer früheren Version größer als 2.2) wurde, wie ein Kommentator feststellt,
toDateMidnight
zugunsten oder des treffend benannten abgelehntwithTimeAtStartOfDay()
, was die Bequemlichkeit erleichtertmöglich.
Nutzen Sie eine viel schönere API.
Mit älteren Versionen können Sie dies tun
quelle
withTimeAtStartOfDay
.toLocalDate
ein Objekt abrufen, das nicht einmal eine Zeitkomponente enthält.Ich habe die Kürzung mit der neuen Java8-API durchgeführt. Ich habe mich einer seltsamen Sache gestellt, aber im Allgemeinen ist sie abgeschnitten ...
quelle
Verwenden Sie DateUtils von Apache mit Kürzung wie folgt:
quelle
Für Zeitstempel:
quelle
Aus java.util.Date JavaDocs:
und aus dem java.sql.Date JavaDocs:
Der beste Ansatz ist also, java.sql.Date zu verwenden, wenn Sie den Zeitteil nicht benötigen
und die Ausgabe ist:
quelle
tl; dr
Übergeben Sie a, um einen String in Ihrem gewünschten Format zu generieren
DateTimeFormatter
.Einzelheiten
Andere Antworten sind korrekt, verwenden jedoch alte Datums- und Uhrzeitklassen, die jetzt vom java.time-Framework veraltet sind.
java.time
Das java.time-Framework ist in Java 8 und höher integriert. Ein Großteil der Funktionen von java.time wird auf Java 6 & 7 ( ThreeTen-Backport ) zurückportiert und weiter an Android ( ThreeTenABP ) angepasst .
Ändern Sie zuerst die Eingabezeichenfolge, um der kanonischen Version des ISO 8601-Formats zu entsprechen. Die Standardformate ISO 8601 werden standardmäßig in java.time-Klassen zum Parsen / Generieren von Zeichenfolgen verwendet, die Datums- und Uhrzeitwerte darstellen. Wir müssen diesen SPACE in der Mitte durch a ersetzen
T
.Jetzt können wir es als a analysieren
LocalDateTime
, wobei "Lokal" keinen bestimmten Ort bedeutet. Dem Eingang fehlen Informationen zum Versatz von UTC oder Zeitzone.Wenn Sie sich weder für die Tageszeit noch für die Zeitzone interessieren, konvertieren Sie zu a
LocalDate
.Erster Moment des Tages
Wenn Sie stattdessen möchten, dass die Uhrzeit auf den ersten Moment des Tages festgelegt wird, verwenden Sie eine
ZonedDateTime
Klasse und konvertieren Sie sie in einLocalDate
Objekt, um ihreatStartOfDay
Methode aufzurufen . Beachten Sie, dass der erste Moment00:00:00
aufgrund der Sommerzeit oder anderer Anomalien möglicherweise nicht die Zeit ist .Die Zeitzone ist entscheidend, da das Datum für jeden Moment weltweit je nach Zone variiert. Zum Beispiel ist ein paar Momente nach Mitternacht in Paris ein neuer Tag für die Pariser, aber für die Kanadier immer noch „gestern“ in Montréal.
koordinierte Weltzeit
Extrahieren Sie ein Objekt , um diesen Moment durch die Linse der UTC- Zeitzone zu sehen
Instant
. Sowohl dasZonedDateTime
als auchInstant
werden den gleichen Moment auf der Zeitachse darstellen, erscheinen jedoch als zwei verschiedene Wanduhrzeiten .An
Instant
ist die grundlegende Bausteinklasse in java.time, per Definition immer in UTC. Verwenden Sie diese Klasse häufig, da Sie im Allgemeinen Ihre Geschäftslogik, Datenspeicherung und den Datenaustausch in UTC durchführen sollten.Wir sehen 5 Uhr morgens statt Mitternacht. Im Standardformat steht das
Z
am Ende fürZulu
und bedeutet "UTC".Ü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 auf java.time Klassen .
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
Verwenden Sie die Kalender Klasse
set()
Verfahren die einzustellenHOUR_OF_DAY, MINUTE, SECOND
undMILLISECOND
Felder auf Null.quelle
Die Frage ist widersprüchlich. Es wird nach einem Datum ohne Tageszeit gefragt, es wird jedoch ein Beispiel mit einer Uhrzeit von angezeigt
00:00:00
.Joda-Zeit
AKTUALISIEREN: Das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Siehe meine andere Antwort für java.time Lösung.
Wenn Sie stattdessen die Tageszeit auf den ersten Moment des Tages einstellen möchten, verwenden Sie a
DateTime
Objekt in der Joda-Time-Bibliothek und rufen Sie dessenwithTimeAtStartOfDay
Methode auf. Beachten Sie, dass der erste Moment möglicherweise nicht die Zeit ist,00:00:00
da die Sommerzeit oder andere Anomalien vorliegen.quelle
Nur
clear()
redundante Felder.Ab Java 8 ist es besser, die
truncatedTo
Methode zu verwendenLocalDateTime
, z.quelle
calendar.clear(Calendar.HOUR_OF_DAY);
die Stunden nicht gelöscht werden. Die Lösung von @cletus funktioniert OK.Es hat mich wirklich geärgert, dass der neue "verbesserte" Kalenderkonstruktor für Millisekunden kein Int benötigt, wie das "schreckliche" alte Datum. Ich wurde dann richtig böse und schrieb folgendes:
Ich habe damals nicht das Wort "Zeug" verwendet, aber dann habe ich das Glück entdeckt:
Aber ich bin immer noch ziemlich verärgert darüber.
quelle
Ich habe das Problem folgendermaßen behoben (in der Zone Eastern 8 (Pekinger Zeit)):
Zunächst sollte klar sein, was Zeitstempel ist. Der Zeitstempel ist die gesamte Millisekunde vom 01. Januar 00:00:00 1970 von GMT (wie UTC) oder vom 01. Januar 08:00:00 CST 1970 bis heute.
Denken Sie daran: Der Zeitstempel ist unabhängig von der Zeitzone.
Sie erhalten also das gleiche Ergebnis mit der folgenden Anweisung in verschiedenen Zeitzonen:
Und
druckt verschiedene Zeitinformationen in verschiedenen Zeitzonen: Wenn Sie Ihre PC-Zeitzone auf UTC einstellen, erhalten Sie
Wenn Sie jedoch die Zeitzone auf (UTC +8: 00) Peking, Chongqing, Hongkong, Urumq einstellen, erhalten Sie:
Java erhält den Zeitstempel und zeigt dann Datums- und Zeitinformationen entsprechend der Zeitzone an.
Für die Einführung, wie Java Datums- und Zeitinformationen in verschiedenen Zeitzonen anzeigt, ist das Trancieren der Zeitinformationen einfach. Sie sollten den Zeitstempel erhalten und die Zeitzone berücksichtigen, wenn Sie die Zeitinformationen abschneiden. Dann können Sie ein neues Datumsobjekt mit dem Schnittzeitstempel erstellen (wir können es Datumsstempel nennen). Java kompensiert die Zeitzone, wenn Datumsinformationen angezeigt werden.
Wie in der östlichen Achtzone (Peking-Zeit) ist die Peking-Zeit 8 Stunden früher als GMT, daher sollten Sie bei der Modulo-Operation mehr 8 Stunden abziehen. Das heißt, Sie sollten zuerst die GMT-Zeit abrufen, dann fügt Java 8 Stunden hinzu, wenn die Anzeigezeit auf der Zeitzoneneinstellung Ihres PCs basiert.
Das Problem mit der Zeitzone ist dunkel und verwirrt mich auch lange. Jetzt mache ich es klar. Hoffnung hilft.
2018-01-04 Die folgende Methode funktioniert auch.
}}
quelle
Sie können dies tun, um Zeitzonenprobleme zu vermeiden:
Das Java-
Date
Objekt ist zwar ein Zeitstempelwert, wird jedoch beim Abschneiden in die lokale Zeitzone konvertiert, sodass Sie einen überraschenden Wert erhalten, wenn Sie einen Wert von der UTC-Zeitzone erwarten.quelle
Calendar
undDate
Klassen wurden vor Jahren mit den java.time- Klassen, die JSR 310 in Java 8 und höher implementieren, zum Legacy . Die Verwendung im Jahr 2018 vorzuschlagen, ist ein schlechter Rat.Könnte eine späte Antwort sein, aber hier ist eine Möglichkeit, dies in einer Zeile zu tun, ohne Bibliotheken zu verwenden:
quelle
Mit Joda-Time seit Version 2.0 können Sie verwenden
LocalDate.toDate()
.Einfach
quelle
a Java Date object
verwendetjava.util.Date
. Außerdem erklärt es nicht, wie problematisch seine Zeitzone mit java.util.Date ist (wann? Wo?), Obwohl er nicht anders kann, als andere zu verwendenDate
.Für alle Antworten, die den Kalender verwenden, sollten Sie ihn stattdessen so verwenden
Aber ich bevorzuge das:
quelle
java.sql.Date
Klasse gibt vor, einen Nur-Datum-Wert darzustellen, hat jedoch tatsächlich eine Uhrzeit, die an die UTC-Zeitzone angepasst ist. Also keine wirklich passende Lösung für die Frage.Wenn Sie Java 8+ verwenden, können Sie auf einfache Weise ein Datum ohne Uhrzeit abrufen : Verwenden Sie den Typ java.time.LocalDate anstelle von Datum.
Die Ausgabe:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
quelle
LocalDate
ist für die meisten Zwecke eine gute Idee, aber es ist unklar, wie dies mit den Eingaben aus der Frage funktioniert2008-01-01 13:15:00
.