Stellen Sie die Uhrzeit auf 00:00:00 ein

Lesezeit: 8 Minuten

Benutzer-Avatar
Adeline

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

    – heenenee

    2. Februar 2016 um 1:23 Uhr


  • FYI, die lästigen alten Datums-Zeit-Klassen wie java.util.Date, java.util.Calendarund java.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

Benutzer-Avatar
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

    – Engagiert

    9. September 2016 um 15:09 Uhr

  • FYI, die lästigen alten Datums-Zeit-Klassen wie java.util.Date, java.util.Calendarund java.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

  • Alles ist korrekt, aber es sollte auch Millis geben: now.set(Calendar.MILLISECOND, 0);

    – Sergej Tschepurnow

    29. Januar 2019 um 3:31 Uhr

Benutzer-Avatar
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();
}

Noch ein JAVA 8-Weg:

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

Aber es ist viel nützlicher, das Datum zu bearbeiten, das bereits vorhanden ist.

Siehe den folgenden Code:

    String datePattern24Hrs = "yyyy-MM-dd HH:mm:ss";
    String datePattern12Hrs = "yyyy-MM-dd hh:mm:ss";

    SimpleDateFormat simpleDateFormat24Hrs = new SimpleDateFormat(datePattern24Hrs);
    SimpleDateFormat simpleDateFormat12Hrs = new SimpleDateFormat(datePattern12Hrs);

    Date dateNow = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dateNow);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    Date dateTime = calendar.getTime();

    String dateTimeIn24Hrs = simpleDateFormat24Hrs.format(dateTime);
    String dateTimeIn12Hrs = simpleDateFormat12Hrs.format(dateTime);

    System.out.println("DateTime in 24Hrs: ".concat(dateTimeIn24Hrs));
    System.out.println("DateTime in 12Hrs: ".concat(dateTimeIn12Hrs));

Die erwartete Ausgabe ist wie folgt:

  • DateTime in 24 Stunden: 2021-06-29 00:00:00
  • DateTime in 12 Stunden: 2021-06-29 12:00:00

Ich hoffe, es hilft bei der Antwort, die Sie suchen.

Benutzer-Avatar
Dmitriy Smerchinskiy

Sie sollten die Zeitzone besser in erster Linie wie folgt auf die DateFormat-Komponente festlegen:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

Dann können Sie die Zeit “00:00:00” erhalten, indem Sie 0 Millisekunden an den Formatierer übergeben:

String time = dateFormat.format(0);

oder Sie können ein Datumsobjekt erstellen:

Date date = new Date(0); // also pass milliseconds
String time = dateFormat.foramt(date);

oder Sie können mehr Möglichkeiten mit der Kalenderkomponente haben, aber Sie sollten auch die Zeitzone als GMT für die Kalenderinstanz festlegen:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 37);
calendar.set(Calendar.SECOND, 27);

dateFormat.format(calendar.getTime());

Benutzer-Avatar
Basil Bourque

tl;dr

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.

DateInstant

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.

LocalTime lt = LocalTime.of( 15 , 30 ) ;  // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ; 

Der erste Augenblick des Tages

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.

LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;

An UTC anpassen

Wenn Sie zu UTC zurückkehren müssen, extrahieren Sie eine Instant.

Instant instant = zdtFirstMomentOfDay.toInstant() ;

InstantDate

Wenn Sie eine brauchen java.util.Date um mit altem Code zu interagieren, auf den noch nicht aktualisiert wurde java.timeKonvertieren.

java.util.Date d = java.util.Date.from( instant ) ;

1334910cookie-checkStellen Sie die Uhrzeit auf 00:00:00 ein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy