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