Ich habe ein Problem beim Zurücksetzen der Stunden in Java. Für ein bestimmtes Datum möchte ich die Stunden auf 00:00:00 einstellen.
Das ist mein Code:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
Das Problem ist, dass manchmal die Zeit ist 12:00:00
und manchmal ist 00:00:00
und wenn ich die Datenbank nach einer Entität abfrage, auf 07.02.2013 00:00:00
der gespeichert wurde, und die tatsächliche Entitätszeit, die gespeichert wird, 12:00:00
die Abfrage fehlschlägt.
Ich weiß das 12:00:00 == 00:00:00
!
Ich benutze AppEngine. Ist dies ein Appengine-Fehler, ein Problem oder ein anderes Problem? Oder hängt es von etwas anderem ab?
java
java.util.calendar
Adelin
quelle
quelle
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
für meinen Zweck verwendet, es funktioniert gut.Antworten:
Verwenden Sie eine andere Konstante statt
Calendar.HOUR
, VerwendungCalendar.HOUR_OF_DAY
.Calendar.HOUR
verwendet 0-11 (zur Verwendung mit AM / PM) undCalendar.HOUR_OF_DAY
verwendet 0-23.Um die Javadocs zu zitieren:
und
Testen ("jetzt" ist derzeit ca. 14:55 Uhr am 23. Juli 2013 Pacific Daylight Time):
Ausgabe:
quelle
Calendar.HOUR
würde PM nicht auf AM gesetzt, so dass es 12:00 Uhr ist.java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .java.time
Verwenden des
java.time
in Java 8 und höher integrierten Frameworks. Siehe Tutorial .Wenn Sie keine Tageszeit benötigen (Stunden-, Minuten-, Sekunden- usw. Teile), sollten Sie den
LocalDate
Unterricht in Betracht ziehen .quelle
LocalDateTime
ist genau die falsche Klasse dafür. Es kann keinen Moment darstellen, da es kein Konzept für Zeitzone oder Versatz von UTC gibt. AnrufenLocalDateTime.now
macht fast nie Sinn. Verwenden SieZonedDateTime
stattdessen. Andernfalls ignorieren Sie wichtige Zeitzonenprobleme. Zum einen beginnen einige Daten in einigen Zonen nicht um 00:00 Uhr!Hier sind einige Dienstprogrammfunktionen, die ich verwende, um genau dies zu tun.
quelle
Noch ein JAVA 8 Weg:
Es ist jedoch viel nützlicher, das bereits vorhandene Datum zu bearbeiten.
quelle
LocalDateTime
kann keinen Moment darstellen, da es kein Konzept für Zeitzone oder Versatz von UTC gibt. AnrufenLocalDateTime.now
macht fast nie Sinn. Sie solltenZonedDateTime
stattdessen verwenden.Sie sollten die Zeitzone in erster Linie wie folgt auf die DateFormat-Komponente festlegen:
Dann können Sie die Zeit "00:00:00" erhalten, indem Sie 0 Millisekunden an den Formatierer übergeben:
oder Sie können ein Datumsobjekt erstellen:
oder Sie können mit der Kalenderkomponente mehr Möglichkeiten haben, aber Sie sollten auch die Zeitzone als GMT für die Kalenderinstanz festlegen:
quelle
tl; dr
java.time
Sie verwenden schreckliche alte Datums- / Uhrzeitklassen , die vor Jahren durch die in JSR 310 definierten modernen java.time- Klassen ersetzt wurden.
Date
➙Instant
A
java.util.Date
repräsentiert einen Moment in UTC. Sein Ersatz istInstant
. Rufen Sie die neuen Konvertierungsmethoden auf, die den alten Klassen hinzugefügt wurden.Zeitzone
Geben Sie die Zeitzone an, in der Ihre neue Tageszeit sinnvoll sein soll.
Geben Sie einen richtigen Zeitzonennamen im Format
Continent/Region
, wie zum BeispielAmerica/Montreal
,Africa/Casablanca
oderPacific/Auckland
. Verwenden Sie niemals die Abkürzung für 2-4 Buchstaben, wie z. B.EST
oder,IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.ZonedDateTime
Wenden Sie das
ZoneId
anInstant
, um eine zu erhaltenZonedDateTime
. Gleicher Moment, gleicher Punkt auf der Zeitachse, aber andere Wanduhrzeit.Tageszeit ändern
Sie haben darum gebeten, die Tageszeit zu ändern. Wenden Sie a
LocalTime
an, um alle Tageszeitteile zu ändern: Stunde, Minute, Sekunde, Bruchteil einer Sekunde. Ein neuesZonedDateTime
wird instanziiert, wobei die Werte auf dem Original basieren. Die java.time- Klassen verwenden dieses unveränderliche Objektmuster , um Thread-Sicherheit zu gewährleisten .Erster Moment des Tages
Aber Sie haben speziell nach 00:00 gefragt. Anscheinend wollen Sie also den ersten Moment des Tages. Achtung: Einige Tage in einigen Zonen beginnen nicht um 00:00:00 Uhr. Sie können aufgrund von Anomalien wie der Sommerzeit (DST) zu einem anderen Zeitpunkt wie z. B. 01:00:00 Uhr beginnen.
Lassen Sie java.time den ersten Moment bestimmen. Extrahieren Sie den Nur-Datum-Teil. Übergeben Sie dann die Zeitzone, um den ersten Moment zu erhalten.
Auf UTC einstellen
Wenn Sie zu UTC zurückkehren müssen, extrahieren Sie eine
Instant
.Instant
➙Date
Wenn Sie einen benötigen
java.util.Date
, um mit altem Code zusammenzuarbeiten, der noch nicht auf java.time aktualisiert wurde , konvertieren Sie.quelle
Dies könnte einfacher sein (In Java 8)
quelle
Wir können den Zeitteil java.util.Date auf 00:00:00 setzen. Mithilfe der LocalDate-Klasse von Java 8 / Joda-datetime api :
quelle
Wenn Sie das Format 00:00:00 in einer Zeichenfolge benötigen, sollten Sie SimpleDateFormat wie folgt verwenden. Verwenden Sie "H" anstelle von "h".
quelle
Eine andere Möglichkeit, dies zu tun, wäre die Verwendung eines DateFormats ohne Sekunden:
quelle
Sie können dies entweder folgendermaßen tun:
quelle
Wenn Java8 neue Datumsfunktionen hinzufügt, können wir dies problemlos tun.
quelle
LocalDateTime
kann keinen Moment darstellen, da es kein Konzept für Zeitzone oder Versatz von UTC gibt. AnrufenLocalDateTime.now
macht fast nie Sinn. Sie solltenZonedDateTime
stattdessen verwenden.