135 Stimmen

Java Date Informationen zur Sperrzeit

Ich habe ein Java-Date-Objekt, das Datums- und Zeitinformationen enthält. Ich möchte eine Methode schreiben, die die Zeitinformationen abschneidet und die Stunden-Minuten-Sekunden abkürzt, so dass nur noch das Datum übrig bleibt.

Beispiel Eingabe:

2008-01-01 13:15:00

Erwartetes Ergebnis:

2008-01-01 00:00:00

Haben Sie einen Tipp? Ich habe versucht, etwas Ähnliches zu tun:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

aber ich bin auf Probleme mit der Zeitzone gestoßen.

1voto

Gelbert Punkte 11

Ich habe das Problem wie folgt behoben (in der östlichen Zone acht (Peking-Zeit)):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

Zunächst einmal sollten Sie sich darüber im Klaren sein, was ein Zeitstempel ist. Der Zeitstempel ist die Summe der Millisekunden vom 01. Januar 00:00:00 1970 GMT (entspricht UTC), oder Thu Jan 01 08:00:00 CST 1970 bis jetzt.

Erinnern Sie sich: Der Zeitstempel ist unabhängig von der Zeitzone.

Sie erhalten also dasselbe Ergebnis mit der folgenden Anweisung in verschiedenen Zeitzonen:

System.out.println(new Date().getTime());

Y

System.out.println(new Date(0));

druckt unterschiedliche Zeitangaben in verschiedenen Zeitzonen: Wenn Sie Ihre PC-Zeitzone auf UTC einstellen, erhalten Sie

Thu Jan 01 00:00:00 UTC 1970

Wenn Sie jedoch die Zeitzone (UTC +8:00) Peking, Chongqing, Hongkong, Urumq einstellen, erhalten Sie:

Thu Jan 01 08:00:00 CST 1970

Java holt sich den Zeitstempel und zeigt dann das Datum und die Uhrzeit je nach Zeitzone an.

Für die Einführung, wie Java das Datum und die Uhrzeit in verschiedenen Zeitzonen anzeigt, ist es einfach, die Zeitangaben umzurechnen. Sie sollten sich den Zeitstempel besorgen und die Zeitzone berücksichtigen, wenn Sie die Zeitinformation abschneiden. Dann können Sie ein neues Date-Objekt mit dem abgeschnittenen Zeitstempel erstellen (wir können es Datumsstempel nennen), Java wird die Zeitzone kompensieren, wenn es Datumsinformationen anzeigt.

In der östlichen Zeitzone (Peking-Zeit) liegt die Peking-Zeit 8 Stunden vor der GMT-Zeit, so dass Sie bei der Modulo-Operation weitere 8 Stunden abziehen müssen. Das heißt, Sie sollten zuerst die GMT-Zeit ermitteln, dann wird Java 8 Stunden hinzufügen, wenn die Zeit basierend auf der Zeitzoneneinstellung Ihres PCs angezeigt wird.


Die Frage der Zeitzone ist undurchsichtig und hat mich auch lange Zeit beschäftigt. Jetzt mache ich es klar. Hoffentlich hilft das.


2018-01-04 Die folgende Methode funktioniert auch.

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

return cal.getTime();

}

0 Stimmen

Zu Ihrer Information: Diese Antwort verwendet lästige alte Datums-Zeit-Klassen, die vor Jahren durch die java.time Klassen.

1voto

Dave Punkte 2667

Es hat mich wirklich geärgert, dass der neue "verbesserte" Kalenderkonstruktor keinen int für Millisekunden nimmt wie der "schreckliche" alte Date-Konstruktor. Ich habe mich dann wirklich geärgert und dies geschrieben:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

Damals habe ich das Wort "Zeug" noch nicht benutzt, aber aber dann entdeckte ich das Glück dieses Wortes:

startTime.set(Calendar.MILLISECOND, 0);

Aber ich bin immer noch ziemlich verärgert darüber.

0voto

lamusique Punkte 332

Mit Joda-Time seit Version 2.0 können Sie LocalDate.toDate() .

Einfach

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();

0 Stimmen

[A] Ihre Antwort ist überflüssig. Bereits veröffentlicht von Brian Agnew . [B] Ihr Code ist falsch, da er die Zeitzone nicht berücksichtigt, also genau das, was in der Frage angesprochen wurde.

0 Stimmen

Es könnte redundant sein, aber ich habe hier nur ein einfacheres Beispiel angeführt, weil ich erkannt habe, dass eine Antwort nicht in den Kommentaren stehen sollte. Ja, java.util.Date ignoriert TimeZone, aber die ursprüngliche Frage war mit a Java Date object Daher habe ich java.util.Date . Außerdem erklärt er nicht, wie seine Zeitzone mit java.util.Date problematisch ist (wann? wo?), obwohl er nicht anders kann als Date .

0voto

Guest Punkte 1

Für alle Antworten, die den Kalender verwenden, sollten Sie ihn stattdessen wie folgt verwenden

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

Aber ich bevorzuge dies:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}

0 Stimmen

El java.sql.Date gibt vor, einen reinen Datumswert darzustellen, hat aber tatsächlich eine an die UTC-Zeitzone angepasste Uhrzeit. Also nicht wirklich eine passende Lösung für die Frage.

0voto

Alex Punkte 93

Könnte eine späte Antwort sein, aber hier ist ein Weg, es in einer Zeile zu tun, ohne Bibliotheken zu verwenden:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X