Umgang mit Zeitzonen mit Java

Bevor es auf das Thema wächst

Beim Umgang mit Zeitzonen mit java.util.Date in Java ist es meines Erachtens üblich, dass Datum und Uhrzeit die verstrichene Zeit (Millisekunden) ab der Epochenzeit und die von GMT zu verwaltende Zeitzone sind. Hier nehmen wir an, dass Datum, Uhrzeit und Zeitzone aus irgendeinem Grund getrennt bleiben. Zum Beispiel sieht es so aus

Artikel Wert
Datum (und Uhrzeit 2016-12-01 15:00:00
Zeitzone Australia/Sydney

Wenn dies in System.out.println usw. angezeigt wird, fühlt sich der Wert des Datumstyps seltsam an, wie unten gezeigt. Mit anderen Worten, ich möchte, dass 15:00 Uhr Zeit für Australien / Sydney ist, aber aus irgendeinem Grund ist es eine lokale Zeitzone. Es ist wie es ist.

Thu Dec 01 15:00:00 JST 2016

sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null]

Außerdem ** Wenn Sie die hier durchgeführte Konvertierung verwenden, wird ein Fehler ausgeführt. Andererseits erreichen Sie diese Logik als Lehrer nicht. ** Wenn Sie eine Lösung finden, werde ich sie erneut veröffentlichen. Ich bin mir nicht sicher, ob die Situation vermieden wird.

Hauptthema

Wie auch immer, ich denke darüber nach, wie ich es als korrekte Daten behalten kann, wenn die obige Situation eintritt. Das Vermeiden solcher Situationen kann die beste Lösung sein.

Für Java 8 oder früher

Es ist ein wenig kniffliger Code. Es ist eine sorgfältige Maßnahme, es in eine Zeichenfolge umzuwandeln.

TimezoneConversion.java


    static Date convertWithBeforeJava7(Date dateTime, TimeZone timeZone) throws ParseException {
        String format = "yyyy/MM/dd HH:mm:ss.SSS";
        SimpleDateFormat local = new SimpleDateFormat(format);
        SimpleDateFormat convert = new SimpleDateFormat(format);
        convert.setTimeZone(timeZone);
        return convert.parse(local.format(dateTime));
    }

Java8

Ich kann mich nicht daran gewöhnen, aber ich habe es auch in Java 8-Klassen versucht. Es ist irgendwie erfrischend, aber ich habe auch das Gefühl, dass ich mir die Mühe machen werde, zum Datumstyp zurückzukehren.

Testergebnisse

Ich habe zwei Arten von Tests durchgeführt. Die Eingabe ist wie folgt.

Umweltbedingung

Artikel Wert
Lokale Zeitzone Australia/Sydney

Eingang

Testnummer Datum (und Uhrzeit Zeitzone
1 2016-10-02 02:00 Australia/Sydney
2 2016-10-02 02:00 America/Montreal

Bitte beachten Sie, dass dies kein ausreichender Test ist. Das Ergebnis ist wie folgt.

java.lang.AssertionError: It would be same date
Expected: is <Sun Oct 02 17:00:00 EST 2016>
     but: was <Sun Oct 02 18:00:00 EST 2016>

	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.junit.Assert.assertThat(Assert.java:956)
	at com.nekoscape.java.sample.TimezoneConversionTest.convertWithOtherTimezone_test_for_Java8Method(TimezoneConversionTest.java:76)
(Kürzung)

java.lang.AssertionError: It would be same date
Expected: is <Sun Oct 02 17:00:00 EST 2016>
     but: was <Sun Oct 02 18:00:00 EST 2016>

	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.junit.Assert.assertThat(Assert.java:956)
	at com.nekoscape.java.sample.TimezoneConversionTest.convertWithOtherTimezone_test_for_beforeJava7Method(TimezoneConversionTest.java:62)
(Kürzung)

Process finished with exit code -1

Zwei Tests sind fehlgeschlagen. Beides tritt auf, wenn Sie Amerika / Montreal angeben, das nicht die lokale Zeitzone ist. Was ist los?

Das Fazit ist, dass diese Logik jetzt Probleme hat, wenn die lokale Zeitzone Sommerzeit ist (Sommerzeit). 2016-10-02 02:00 als Datum und Uhrzeit angegeben ist das Startdatum und die Startzeit der Sommerzeit von Australien / Sydney. Wenn es daher als Datumstyp aus einer Zeichenfolge beibehalten wird, bedeutet dies bereits 2016-10-02 03:00. Infolgedessen tritt eine Stunde Konvertierungsfehler auf.

Wie eingangs erwähnt, handelt es sich um einen Fehler. Ich habe es nicht gelöst. Bitte kopieren Sie nicht, auch wenn Sie einen Fehler machen. Die Quelle befindet sich unten, damit Sie sie ausprobieren können. Quellcode: Zeitzonenumwandlung

Recommended Posts

Umgang mit Zeitzonen mit Java
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
[Hinweis] Behandlung von Java-Dezimalstellen
Schrittweises Verständnis der Behandlung von Java-Ausnahmen
Zusammenfassung der objektorientierten Programmierung mit Java
Ich habe versucht, Google HttpClient von Java zu verwenden
Statusüberwachung von Java-Apps mit Elasticsearch
Erfassung von Eingabeinhalten mit Scanner (Java)
Java-Ausnahmebehandlung?
[Java] Ausnahmebehandlung
☾ Java / Ausnahmebehandlung
Informationen zur Behandlung von Java-Ausnahmen
Behandlung von Java-Ausnahmen
[Java] Übersicht über Java
[Java] Behandlung von Java Beans in der Methodenkette
Überprüfung der Auswirkungen auf die Leistung bei Verwendung von Java Volatile
Spüren Sie den Lauf der Zeit auch in Java
Versuchen Sie eine ähnliche Suche in der Bildsuche mit dem Java SDK [Suche]
Ein Beispiel, bei dem die Verwendung von Addition schneller ist als die Verwendung von StringBuilder (Java)
Das Datum und die Uhrzeit von java8 wurden aktualisiert
Geschichte der Testautomatisierung mit Appium [Android / Java]
Abgelaufene Java-Sammlung
Sortieren mit Java-Komparator
Voraussichtliche Funktionen von Java
[Java] Bedeutung der serialVersionUID
[Java] Datums- / Zeitoperationen
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java - Vereinigung von Kommentaren
Schrottpraxis mit Java ②
Geschichte der Java-Annotationen
Zusammenfassung der Verwendung von FragmentArgs
Java (Verdienste des Polymorphismus)
Schrottpraxis mit Java ①
NIO Bewertung von Java
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
[Java] Drei Funktionen von Java
Zusammenfassung der Verwendung von DBFlow
Zusammenfassung der Java-Unterstützung 2018
[Java] Umgang mit Zeichenketten (String-Klasse und StringBuilder-Klasse)
Umgang mit Datum und Uhrzeit in Ruby. Verwenden Sie Datum und Uhrzeit richtig.
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Verwenden mehrerer Java-Versionen mit Brew auf Mac + jEnv
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
[Java] Versuchen Sie, die Elemente der Json-Zeichenfolge mithilfe der Bibliothek zu bearbeiten
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
[Einführung in Java] Umgang mit Zeichenfolgen (String-Klasse, StringBuilder-Klasse)
Beispiel für Parameter mit where
Über den Umgang mit Null
Über Java-Instanzen
[Java] Mirage-Basic-Verwendung von SQL
[Java] Anfängerverständnis von Servlet-②
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Grundlagen der Zeichenoperation (Java)
Versuchen Sie, mit Java zu kratzen [Hinweis]
Zusammenfassung der Verwendung von ButterKnife
[Java] Erstellen von Originalanmerkungen
Java-Lerntag 4
[Java] Anfängerverständnis von Servlet-①