[JAVA] Faites attention à l'heure d'été lors de l'inscription / référence de l'anniversaire d'un utilisateur

1. Vue d'ensemble

Convertir en millisecondes sur la face avant Lors de l'envoi des informations de temps à l'API backend Vous devez tenir compte de l'heure d'été.

Si vous le convertissez avec une méthode Java, il gérera l'heure d'été, C'est parce que javascript ne le gère pas.

Dans cet article, comment Java gère l'heure d'été Je vais vous dire les spécifications détaillées de la conversion.

problème

L'anniversaire d'une personne née pendant la période estivale Un événement affiché un jour de congé s'est produit.

Solution

1 heure lors de l'inscription / référence pendant l'heure d'été Il est nécessaire d'ajouter et de soustraire des millisecondes.

2. Détails

La période d'introduction de l'heure d'été au Japon est la suivante.

Année Heure de début Heure de fin
1948 (Showa 23) Le 2 mai(journée)2 heures du matin 9月11journée(sol)2 heures du matin
1949 (Showa 24) 3 avril(journée)2 heures du matin 9月10journée(sol)2 heures du matin
1950 (1950) 7 mai(journée)2 heures du matin 9月9journée(sol)2 heures du matin
1951 (Showa 26) 6 mai(journée)2 heures du matin 9月8journée(sol)2 heures du matin

Date et heure ⇒ milliseconde

Début de l'heure d'été

Pour entrer l'heure d'été à 2 h 00 le lundi 2 mai L'heure est avancée d'une heure et la milliseconde équivaut à 3h00 du matin.

** Source de vérification **

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

** Résultat de sortie **

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

La conversion à 2h00 du matin est la suivante.

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

De 2: 59: 59: 999 à 3h00 Je comprends les spécifications à corriger. Cependant, il n'y a pas 2h00 du matin pendant l'heure d'été. On ne s'attend pas à ce que la conversion en millisecondes entre 2 et 3 heures soit utilisée.

Fin de l'heure d'été

Pour sortir de l'heure d'été à 1h du matin le lundi 11 septembre L'heure doit être rétablie d'une heure.

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

La différence est de 1 seconde dans la notation de la date et de l'heure, En millisecondes, il est corrigé à 3601000 millisecondes.

Milli secondes ⇒ date et heure

Début de l'heure d'été

Revenons maintenant à la notation de la date et de l'heure à partir de la milliseconde.

** Source de vérification **

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

** Résultat de sortie **

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

Fin de l'heure d'été

-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

Les spécifications sont telles que le niveau 1 heure du matin arrive deux fois.

3. Remède

Lors de la conversion à l'avant, corrigez la milliseconde de la période correspondante Correction de l'envoi des informations de temps à l'API.

dateUtil.ts


    /**
     *Obtenir l'heure en tenant compte de l'heure d'été (convertie lorsqu'elle est affichée de l'API vers l'avant)
     */
    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
    }

    /**
     *Heure de remplacement en tenant compte de l'heure d'été (convertie lors de l'inscription de front à 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. Résumé

Je pense qu'il vaut mieux se demander s'il faut gérer l'heure à laquelle l'heure d'été est introduite au stade de l'examen des spécifications. De plus, je pense que nous devrions considérer séparément comment l'éviter, comme utiliser UTC pour le fuseau horaire.

5. Référence

Heure d'été et Java japonais À propos de l'heure d'été réelle

Recommended Posts

Faites attention à l'heure d'été lors de l'inscription / référence de l'anniversaire d'un utilisateur
[Notes techniques] Éléments à prendre en compte du point de vue d'un ingénieur lors de la création d'une vue
Faites attention au moment d'initialisation lors de l'utilisation de MessageEncryptor avec Rails 5.2 / 6.0