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 setzen.
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 es so 00:00:00 und wenn ich die Datenbank nach einer gespeicherten Entität abfrage 07.02.2013 00:00:00 und die tatsächliche Entitätszeit, die gespeichert wird, ist 12:00:00 die Abfrage schlägt fehl.
ich weiß das 12:00:00 == 00:00:00!
Ich verwende AppEngine. Handelt es sich um einen AppEngine-Bug, ein Problem oder ein anderes Problem? Oder hängt es von etwas anderem ab?
Könnte das mit unterschiedlichen Locales zu tun haben oder passiert das immer vom selben PC?
– Verirrter Junge
23. Juli 2013 um 21:48 Uhr
es passiert, wenn ich auf appengine bereitstelle.
– Adeline
23. Juli 2013 um 21:50 Uhr
Viele andere Lösungen zum Verkürzen der Zeit: stackoverflow.com/a/1908955/2646526
ich benutzte calendar.set(Calendar.HOUR_OF_DAY, 0);für meinen Zweck funktioniert es gut.
– Hariprasad
31. Juli 2019 um 13:02 Uhr
rgettman
Verwenden Sie stattdessen eine andere Konstante Calendar.HOURverwenden Calendar.HOUR_OF_DAY.
calendar.set(Calendar.HOUR_OF_DAY, 0);
Calendar.HOUR verwendet 0-11 (zur Verwendung mit AM/PM) und Calendar.HOUR_OF_DAY verwendet 0-23.
Um die Javadocs zu zitieren:
public static final int STUNDE
Feldnummer für get und set, die die Stunde des Vormittags oder Nachmittags angibt. HOUR wird für die 12-Stunden-Uhr verwendet (0 – 11). Mittag und Mitternacht werden durch 0 und nicht durch 12 dargestellt. Beispiel: Um 22:04:15.250 Uhr ist die STUNDE 10.
und
public static final int HOUR_OF_DAY
Feldnummer für get und set, die die Stunde des Tages angibt. HOUR_OF_DAY wird für die 24-Stunden-Uhr verwendet. Beispiel: Um 22:04:15.250 Uhr ist HOUR_OF_DAY 22.
Testen (“jetzt” ist derzeit ca. 14:55 Uhr am 23. Juli 2013 pazifischer Sommerzeit):
public class Main
{
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args)
{
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
System.out.println(sdf.format(now.getTime()));
now.set(Calendar.HOUR_OF_DAY, 0);
System.out.println(sdf.format(now.getTime()));
}
}
Ausgabe:
$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00
@JarrodRoberson Aber mit Calendar.HOUR würde PM nicht auf AM setzen und es auf 12:00 Uhr belassen.
– rgettmann
23. Juli 2013 um 21:48 Uhr
Wer auch immer die Felder HOUR und HOUR_OF_DAY erstellt hat, hätte ausgepeitscht und auf Rationen gesetzt werden sollen.
– Johannes
8. September 2015 um 14:19 Uhr
@AndroidDev Wer auch immer am / pm erfunden hat, verdient dasselbe … Dies gilt auch für nicht metrische Standards
Alles ist korrekt, aber es sollte auch Millis geben: now.set(Calendar.MILLISECOND, 0);
– Sergej Tschepurnow
29. Januar 2019 um 3:31 Uhr
Przemek
java.time
Verwendung der java.time Framework, das in Java 8 und höher integriert ist. Sehen Lernprogramm.
import java.time.LocalTime;
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00
Wenn Sie keine Tageszeit (Stunde, Minute, Sekunde usw.) benötigen, sollten Sie die Verwendung von in Betracht ziehen LocalDate Klasse.
LocalDate.now(); # 2015-11-19
Dies sollte die neue akzeptierte Antwort sein, da Java 1.8 veröffentlicht wurde, seit diese Frage zum ersten Mal gestellt wurde.
– matt forsythe
1. Februar 2018 um 18:00 Uhr
LocalDateTime ist genau das falsche Klasse dafür zu verwenden. Es kann keinen Moment darstellen, da es kein Konzept für Zeitzone oder Offset von UTC gibt. Berufung LocalDateTime.now fast nie sinnvoll. Verwenden ZonedDateTime stattdessen. Andernfalls ignorieren Sie wichtige Zeitzonenprobleme. Zum einen tun einige Daten in einigen Zonen nicht Beginn um 00:00!
– Basilikum Bourque
26. Mai 2019 um 20:28 Uhr
Hier sind einige Hilfsfunktionen, die ich verwende, um genau dies zu tun.
/**
* sets all the time related fields to ZERO!
*
* @param date
*
* @return Date with hours, minutes, seconds and ms set to ZERO!
*/
public static Date zeroTime( final Date date )
{
return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}
/**
* Set the time of the given Date
*
* @param date
* @param hourOfDay
* @param minute
* @param second
* @param ms
*
* @return new instance of java.util.Date with the time set
*/
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
final GregorianCalendar gc = new GregorianCalendar();
gc.setTime( date );
gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
gc.set( Calendar.MINUTE, minute );
gc.set( Calendar.SECOND, second );
gc.set( Calendar.MILLISECOND, ms );
return gc.getTime();
}
myJavaUtilDate // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant() // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate() // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) ) // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.
java.time
Sie verwenden schreckliche alte Datums- und Uhrzeitklassen, die vor Jahren durch die Moderne ersetzt wurden java.time Klassen definiert in JSR 310.
Date ➙ Instant
EIN java.util.Date repräsentieren einen Moment in UTC. Sein Ersatz ist Instant. Rufen Sie die neuen Konvertierungsmethoden auf, die den alten Klassen hinzugefügt wurden.
Instant instant = myJavaUtilDate.toInstant() ;
Zeitzone
Geben Sie die Zeitzone an, in der Ihre neue Tageszeit sinnvoll sein soll.
Geben Sie a an richtiger Zeitzonenname im Format von Continent/Regionwie zum Beispiel America/Montreal, Africa/Casablancaoder Pacific/Auckland. Verwenden Sie niemals die 2-4-Buchstaben-Abkürzung wie z EST oder IST so wie sie sind nicht echte Zeitzonen, nicht standardisiert und nicht einmal eindeutig (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Wende an ZoneId zum Instant ein bekommen ZonedDateTime. Gleicher Moment, gleicher Punkt auf der Zeitachse, aber unterschiedliche Uhrzeit.
ZonedDateTime zdt = instant.atZone( z ) ;
Wechselnde Tageszeit
Sie haben darum gebeten, die Uhrzeit zu ändern. Bewerben a LocalTime um alle Teile der Tageszeit zu ändern: Stunde, Minute, Sekunde, Sekundenbruchteile. Ein neuer ZonedDateTime wird instanziiert, mit Werten, die auf dem Original basieren. Das java.time Klassen verwenden dies unveränderliche Objekte Muster bereitzustellen Thread-Sicherheit.
Aber Sie haben ausdrücklich nach 00:00 Uhr gefragt. Anscheinend wollen Sie also den ersten Moment des Tages. Achtung: Manche Tage in einigen Zonen beginnen nicht um 00:00:00. Sie können aufgrund von Anomalien wie der Sommerzeit (DST) zu einem anderen Zeitpunkt wie 01:00:00 beginnen.
Lassen java.time den ersten Moment bestimmen. Extrahieren Sie den Nur-Datum-Teil. Passieren Sie dann die Zeitzone, um den ersten Moment zu erhalten.
Könnte das mit unterschiedlichen Locales zu tun haben oder passiert das immer vom selben PC?
– Verirrter Junge
23. Juli 2013 um 21:48 Uhr
es passiert, wenn ich auf appengine bereitstelle.
– Adeline
23. Juli 2013 um 21:50 Uhr
Viele andere Lösungen zum Verkürzen der Zeit: stackoverflow.com/a/1908955/2646526
– heenenee
2. Februar 2016 um 1:23 Uhr
FYI, die lästigen alten Datums-Zeit-Klassen wie
java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbeersetzt durch die java.time Klassen, die in Java 8 und Java 9 integriert sind. Siehe Tutorial von Oracle.– Basilikum Bourque
1. Februar 2018 um 4:42 Uhr
ich benutzte
calendar.set(Calendar.HOUR_OF_DAY, 0);
für meinen Zweck funktioniert es gut.– Hariprasad
31. Juli 2019 um 13:02 Uhr