Gestion des fuseaux horaires avec Java

Avant qu'il ne grandisse sur le sujet

Lorsqu'il s'agit de fuseaux horaires en utilisant java.util.Date en Java, je pense qu'il est courant que la date et l'heure soient le temps écoulé (millisecondes) entre l'heure et le fuseau horaire gérés par GMT. , Ici, nous supposons que la date, l'heure et le fuseau horaire sont séparés pour une raison quelconque. Par exemple, cela ressemble à ceci

article valeur
Date et l'heure 2016-12-01 15:00:00
Fuseau horaire Australia/Sydney

Lorsque cela est affiché par System.out.println etc., la valeur détenue par le type Date semble étrange comme indiqué ci-dessous. En d'autres termes, je veux que 15h00 soit l'heure d'Australie / Sydney, mais pour une raison quelconque, c'est un fuseau horaire local. C'est comme ça.

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]

Aussi, ** Si vous utilisez la conversion effectuée ici, vous exécuterez un bogue, donc d'un autre côté, n'atteignez pas cette logique en tant qu'enseignant. ** Si vous trouvez une solution, je la posterai à nouveau. Je ne sais pas si la situation est évitée.

Sujet principal

Quoi qu'il en soit, je réfléchis à la façon de les conserver en tant que données correctes lorsque la situation ci-dessus se produit. Éviter de telles situations peut être la meilleure solution.

Pour Java 8 ou version antérieure

C'est un petit code délicat. C'est une mesure minutieuse pour le convertir en une chaîne de caractères.

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

Je ne peux pas m'y habituer, mais je l'ai également essayé dans les classes Java 8. C'est rafraîchissant en quelque sorte, mais j'ai aussi l'impression que je vais prendre la peine de revenir au type Date.

résultats de test

J'ai fait deux types de tests. L'entrée est la suivante.

Condition environnementale

article valeur
Fuseau horaire local Australia/Sydney

contribution

Numéro de test Date et l'heure Fuseau horaire
1 2016-10-02 02:00 Australia/Sydney
2 2016-10-02 02:00 America/Montreal

Veuillez noter que ce n'est pas un test suffisant. Le résultat est le suivant.

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)
(réduction)

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)
(réduction)

Process finished with exit code -1

Deux tests ont échoué. Les deux se produisent lorsque vous spécifiez Amérique / Montréal, qui n'est pas un fuseau horaire local. Que ce passe-t-il?

L'essentiel est que cette logique présente désormais des problèmes lorsque le fuseau horaire local est l'heure d'été (heure d'été). 2016-10-02 02:00 spécifié comme la date et l'heure est la date et l'heure de début de l'heure d'été Australie / Sydney. Par conséquent, lorsqu'il est conservé comme type de date à partir d'une chaîne de caractères, cela signifie déjà 2016-10-02 03:00. En conséquence, il y a une heure d'erreur de conversion.

Comme mentionné au début, c'est un bug. Je ne l'ai pas résolu. Veuillez ne pas copier même si vous faites une erreur. La source est placée ci-dessous afin que vous puissiez l'essayer. Code source: timezone-conversion

Recommended Posts

Gestion des fuseaux horaires avec Java
[Java] Pratique de la gestion des exceptions [Exception]
[Note] Gestion des points décimaux Java
Compréhension étape par étape de la gestion des exceptions Java
Résumé de la programmation orientée objet utilisant Java
J'ai essayé d'utiliser Google HttpClient de Java
Surveillance de l'état des applications Java à l'aide d'Elasticsearch
Acquisition du contenu d'entrée à l'aide de Scanner (Java)
Gestion des exceptions Java?
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
[Java] Présentation de Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
Vérification de l'impact sur les performances lors de l'utilisation de Java volatile
Ressentez le passage du temps même à Java
Essayez une recherche similaire de recherche d'images à l'aide du SDK Java [Recherche]
Un exemple où il est plus rapide d'utiliser l'addition que d'utiliser StringBuilder (Java)
La date et l'heure de java8 ont été mises à jour
Histoire de l'automatisation des tests avec Appium [Android / java]
Collection expirée de java
Tri à l'aide du comparateur java
Caractéristiques prévues de Java
[Java] Importance de serialVersionUID
[Java] Opérations de date / heure
NIO.2 examen de Java
Avis sur Java Shilber
java --Unification des commentaires
Pratique de grattage avec Java ②
Histoire des annotations Java
Résumé de l'utilisation de FragmentArgs
java (mérites du polymorphisme)
Pratique du grattage avec Java ①
Examen NIO de Java
[Java10] Veillez à utiliser ensemble var et génériques
[Java] Trois fonctionnalités de Java
Résumé de l'utilisation de DBFlow
Résumé du support Java 2018
[Java] Gestion des chaînes de caractères (classe String et classe StringBuilder)
Traitement de la date et de l'heure en Ruby. Utilisez correctement la date et l'heure.
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Utilisation de plusieurs versions de Java avec Brew sur Mac + jEnv
Vérifiez l'état des applications Java sans utiliser d'outils de surveillance
[Java] Essayez de modifier les éléments de la chaîne Json à l'aide de la bibliothèque
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
[Introduction à Java] Gestion des chaînes de caractères (classe String, classe StringBuilder)
Exemple de paramètres utilisant where
À propos de la gestion de Null
À propos des instances Java
[Java] Utilisation de Mirage-Basic de SQL
[Java] Compréhension débutante de Servlet-②
[Java11] Résumé du flux -Avantages du flux-
Principes de base de l'utilisation des caractères (Java)
Essayez de gratter en utilisant Java [Note]
Résumé de l'utilisation de ButterKnife
[Java] Création d'annotations originales
java learning day 4
[Java] Compréhension débutante de Servlet-①