[JAVA] Achten Sie auf die Sommerzeit, wenn Sie den Geburtstag eines Benutzers neu registrieren / referenzieren

1. Übersicht

Auf der Vorderseite in Millisekunden umrechnen Beim Senden von Zeitinformationen an die Backend-API Sie müssen die Sommerzeit berücksichtigen.

Wenn Sie es mit einer Java-Methode konvertieren, wird es die Sommerzeit behandeln, Dies liegt daran, dass Javascript nicht damit umgeht.

In diesem Artikel wird beschrieben, wie Java mit der Sommerzeit umgeht Ich werde Ihnen die detaillierten Spezifikationen der Konvertierung mitteilen.

Problem

Der Geburtstag einer im Sommer geborenen Person Ein Ereignis, das an einem freien Tag angezeigt wird, ist aufgetreten.

Lösungen

1 Stunde bei der Registrierung / Referenz im Sommer Es ist notwendig, Millisekunden zu addieren und zu subtrahieren.

2. Details

Die Einführungsphase für die Sommerzeit in Japan ist wie folgt.

Jahr Startzeit Endzeit
1948 (Showa 23) 2. Mai(Tag)2 Uhr morgens 9月11Tag(Boden)2 Uhr morgens
1949 (Showa 24) 3. April(Tag)2 Uhr morgens 9月10Tag(Boden)2 Uhr morgens
1950 (1950) 7. Mai(Tag)2 Uhr morgens 9月9Tag(Boden)2 Uhr morgens
1951 (Showa 26) 6. Mai(Tag)2 Uhr morgens 9月8Tag(Boden)2 Uhr morgens

Datum und Uhrzeit ⇒ Millisekunde

Sommerzeit beginnen

Um am Montag, den 2. Mai, um 2:00 Uhr in die Sommerzeit einzutreten Die Zeit wird um eine Stunde vorverlegt und die Millisekunde entspricht 3:00 Uhr.

** Verifizierungsquelle **

SummerTime.java


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SummerTime {
	public static void main(String[] args) throws ParseException {
		convertToMilliseconds("1948-05-02 02:00:00");
		convertToMilliseconds("1948-05-02 03:00:00");
	}

	private static void convertToMilliseconds(String dateStr) throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = formatter.parse(dateStr);
		System.out.println(dateStr + " -> " + date.getTime());
	}
}

** Ausgabeergebnis **

1948-05-02 02:00:00 -> -683794800000
1948-05-02 03:00:00 -> -683794800000

Die Umstellung um 2:00 Uhr ist wie folgt.

1948-05-02 02:00:00 -> -683794800000
1948-05-02 02:00:01 -> -683794799000
1948-05-02 02:00:02 -> -683794798000
・
・
・
1948-05-02 02:59:58 -> -683791202000
1948-05-02 02:59:59 -> -683791201000
1948-05-02 03:00:00 -> -683794800000

Von 2: 59: 59: 999 bis 3:00 Uhr Ich verstehe die zu korrigierenden Spezifikationen. Im Sommer gibt es jedoch keine 2:00 Uhr. Es wird nicht erwartet, dass die Millisekundenumwandlung zwischen 2 und 3 Uhr verwendet wird.

Ende der Sommerzeit

Um am Montag, den 11. September, um 1:00 Uhr morgens aus der Sommerzeit herauszukommen Die Zeit muss um eine Stunde wiederhergestellt werden.

1948-09-11 00:59:59 -> -672397201000
1948-09-11 01:00:00 -> -672393600000

Die Differenz beträgt 1 Sekunde in der Datums- und Uhrzeitnotation. In Millisekunden wird es auf 3601000 Millisekunden korrigiert.

Millimeter ⇒ Datum und Uhrzeit

Sommerzeit beginnen

Wechseln wir nun von Millisekunde zur Datums- und Uhrzeitnotation zurück.

** Verifizierungsquelle **

SummerTime.java


private static void convertToTimeFormat(Long milliSeconds) throws ParseException {
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	String dateStr = formatter.format(milliSeconds);
	System.out.println(milliSeconds + " -> " + dateStr);
}

** Ausgabeergebnis **

-683794801000 -> 1948-05-02 01:59:59
-683794800000 -> 1948-05-02 03:00:00
-683794799000 -> 1948-05-02 03:00:01

Ende der Sommerzeit

-672397201000 -> 1948-09-11 00:59:59
-672397200000 -> 1948-09-11 01:00:00
-672397199000 -> 1948-09-11 01:00:01
・
・
・
-672393601000 -> 1948-09-11 01:59:59
-672393600000 -> 1948-09-11 01:00:00
-672393599000 -> 1948-09-11 01:00:01

Die Spezifikationen sind so, dass die 1-Uhr-Stufe zweimal kommt.

3. Abhilfe

Korrigieren Sie beim Konvertieren an der Vorderseite die Millisekunde des entsprechenden Zeitraums Problem beim Senden von Zeitinformationen an die API behoben.

dateUtil.ts


    /**
     *Holen Sie sich Zeit unter Berücksichtigung der Sommerzeit (konvertiert, wenn von API nach vorne angezeigt)
     */
    export function getSummerTimeDate(birthDate){
        let birth = Number(birthDate)
        if ((birth >= -683794800000 && birth <= -672393600001)
            || (birth >= -654764400000 && birth <= -640944000001)
            || (birth >= -620290800000 && birth <= -609494400001)
            || (birth >= -588841200000 && birth <= -578044800001)) {
            birth += 3600000
        }
        return birth
    }

    /**
     *Ersatzzeit unter Berücksichtigung der Sommerzeit (umgerechnet bei der Registrierung von vorne auf API)
     */
    export function setSummerTimeDate(birthDate){
        let birth = Number(birthDate)
        if ((birth >= -683791200000 && birth <= -672390000001)
            || (birth >= -654760800000 && birth <= -640940400001)
            || (birth >= -620287200000 && birth <= -609490800001)
            || (birth >= -588837600000 && birth <= -578041200001)) {
            birth -= 3600000
        }
        return birth
    }

4. Zusammenfassung

Ich denke, es ist besser zu überlegen, ob die Zeit, zu der die Sommerzeit eingeführt wird, in der Phase der Prüfung der Spezifikationen behandelt werden soll. Ich denke auch, wir sollten separat überlegen, wie dies vermieden werden kann, z. B. die Verwendung von UTC für die Zeitzone.

5. Referenz

Japanische Sommerzeit und Java Über die reale Sommerzeit

Recommended Posts

Achten Sie auf die Sommerzeit, wenn Sie den Geburtstag eines Benutzers neu registrieren / referenzieren
[Technische Hinweise] Dinge, die aus der Sicht eines Ingenieurs beim Erstellen einer Ansicht zu beachten sind
Achten Sie bei der Verwendung von MessageEncryptor mit Rails 5.2 / 6.0 auf den Zeitpunkt der Initialisierung