[JAVA] Die Geschichte, dass der Umgang mit alten Daten ärgerlich ist

Überblick

Im Allgemeinen denke ich, dass das Verarbeiten von Daten in der Programmierung ein ziemlich langwieriger Prozess ist, aber ich werde Ihnen sagen, dass es beim Umgang mit alten Daten problematischer sein wird. Der Beispielcode ist in Java geschrieben, aber ich denke, dass ähnliche Probleme in anderen Sprachen auftreten werden.

Betriebsumgebung

Text

Fall 1: Der Zeitzonenversatz wird zu "+09: 18: 59".

LocalDateTime.of(1887, 1, 1, 0, 0).atZone(ZoneId.of("Asia/Tokyo"));
// 1887-01-01T00:00+09:18:59[Asia/Tokyo]

Der Zeitzonenversatz in der japanischen Standardzeit beträgt grundsätzlich "+09: 00". Wenn Sie jedoch 1887 angeben, beträgt der Zeitzonenversatz "+09: 18: 59". Da auch Sekunden enthalten sind und sich vom allgemeinen Format unterscheiden. Wenn dieser Wert beispielsweise auf dem Server generiert und an den Client zurückgegeben wird, können Probleme wie Fehler beim Parsen mit JavaScript-Code auf der Front-End-Seite auftreten. (passiert)

Ursache

Das liegt daran, dass die tz-Datenbank dies tatsächlich tut. Wie der Name schon sagt, ist die tz-Datenbank eine Datenbank mit Zeitzoneninformationen. In Java wird es mit JRE gebündelt und von der Bibliothek referenziert, die Datum und Uhrzeit in Java verarbeitet.

Die aktuelle japanische Standardzeit begann am 1. Januar 1888 und war zuvor anders, so dass sich dies in der tz-Datenbank widerspiegelt.

Fall 2: Datum wird 10 Tage lang übersprungen

Dies ist ein Beispiel, bei dem sich das Ergebnis nach Java 8 zwischen der alten und der neuen API ändert.

Zuerst von der alten API.

var cal = Calendar.getInstance();
cal.clear();
cal.set(1582, Calendar.OCTOBER, 4);

var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.format(cal.getTime());    // "1582-10-04 00:00:00"

Ich habe 1582/10/4 angegeben und es wurde so ausgegeben, wie es ist. Was ist also mit der neuen API?

var cal = Calendar.getInstance();
cal.clear();
cal.set(1582, Calendar.OCTOBER, 4);

LocalDateTime.ofInstant(cal.toInstant(), ZoneId.of("Asia/Tokyo"));
// 1582-10-14T00:18:59

Es war um 10 Tage aus.

Ursache

Dies liegt daran, dass verschiedene Bibliotheken vor dem 15. Oktober 1582 unterschiedlich behandelt werden. Der 15. Oktober 1582 ist ein besonderes Datum, an dem der aktuelle Gregorio-Kalender eingeführt wurde. Zuvor wurde der Julius-Kalender verwendet. Daher ist es in eine Bibliothek unterteilt, die den Tag vor dem 15. Oktober 1582 als Julius-Kalender behandelt, und eine Bibliothek, die ihn als Pseudo-Gregorio-Kalender behandelt (Start des Gregorio-Kalenders). In Java ist die alte API die frühere und die neue Das Ergebnis hat sich geändert, da sich die API von der letzteren unterscheidet.

Darüber hinaus wurde der Übergang vom Julius-Kalender zum Gregorio-Kalender mit dem Tag nach dem 4. Oktober 1582 im Julius-Kalender als 15. Oktober 1582 im Gregorio-Kalender durchgeführt. Mit anderen Worten, es flog tatsächlich 10 Tage lang, sodass sich der Unterschied als Ergebnis der Verarbeitung der Datumsbibliothek herausstellte.

Fall 3: Der Zeitzonenversatz ist um 1 Stunde deaktiviert

LocalDateTime.of(1950, 8, 1, 0, 0).atZone(ZoneId.of("Asia/Tokyo"));
// 1950-08-01T00:00+10:00[Asia/Tokyo]

Der Zeitzonenversatz in der japanischen Standardzeit beträgt grundsätzlich "+09: 00". (Zweites Mal) Dieses Ergebnis ist jedoch "+10: 00".

Ursache

Wie Fall 1, jedoch weil die tz-Datenbank dies tatsächlich tut. Was die aktuellen Angelegenheiten betrifft, gab es vor einiger Zeit viel Lärm, als versucht wurde, die Sommerzeit für die Olympischen Spiele in Tokio einzuführen. Viele von Ihnen wissen es vielleicht anhand der damaligen Nachrichten, aber in Japan wurde die Sommerzeit tatsächlich zwischen 1949 und 1951 eingeführt. Das spiegelt sich in der tz-Datenbank wider.

Zusammenfassung

――In der japanischen Standardzeit besteht bei altem Datum die Möglichkeit, dass eine Abweichung auftritt oder sich der Zeitzonenversatz ändert.

Referenzlink

http://nowokay.hatenablog.com/entries/2015/01/09 https://ja.wikipedia.org/wiki/Tz_database http://www.mwsoft.jp/programming/other/time_mendoi.html https://qiita.com/sota2502/items/e8df68d9cfebd01af809

Recommended Posts

Die Geschichte, dass der Umgang mit alten Daten ärgerlich ist
Eine Geschichte über die Verbindung zu einem CentOS 8-Server mit einem alten Ansible
[Android] Wie man mit dunklen Themen umgeht
Es ist gut, eine Programmierschule zu besuchen.
Wenn Sie mit Ruby eine Zip-Datei erstellen möchten, ist dies Rubyzip.
Der Umgang mit dem Vorkompilieren von Assets ist fehlgeschlagen.
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
Konvertieren Sie eine Zeichenfolge mit swift in ein zeichenweises Array
Übergang zu einem View Controller mit Swift WebKit
Rippen Sie eine CD mit Ubuntu 18.04 LTS auf MP3
Ich habe versucht, den Block mit Java zu brechen (1)
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
Minecraft BE Tippe mit einem Holzschwert, um zu springen
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
Diätprogramm mit Präprozessor (Umgang mit der Größe von i-appli)
Berücksichtigung des in SpringToolSuite (STS) verwendeten Eigenschaftseditors
So löschen Sie ein mit Rails erstelltes new_record-Objekt
Umgang mit Keine Vorlage für interaktive Anfragen
So generieren Sie manuell ein JWT mit Knock in Rails
[Docker-Umgebung] Umgang mit ActiveSupport :: MessageEncryptor :: InvalidMessage
Ich möchte eine bestimmte Datei mit WatchService überwachen
Eine Geschichte über den Versuch, mit Mockito auszukommen
[So fügen Sie ein Video mit Rails in haml ein]
[Rails] Umgang mit URL-Änderungen nach dem Rendern
Weigert sich, ein Paket mit dem Namen "webpack" unter einem Paket zu installieren
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Es ist keine große Sache, wenn Sie verstehen, dass ich süchtig danach war, E-Mails mit Java Mail von Exchange Online zu empfangen