Ajout de jours dans le fuseau horaire Java Heure d'été d'Europe de l'Est (EEST)


J'ai écrit une application Java dans laquelle je commence la date à Jan 1 00:00 d'une année particulière. Ensuite, j'incrémente le jour 355 fois et imprime les résultats en cours de route. J'essayais de comprendre comment les fuseaux horaires fonctionnent autour de l'heure d'été, et si l'ajout de 1 jour décalerait l'heure de minuit à 1h du matin lors du passage à l'heure d'été. Mon code ressemble à:

TimeZone tz = TimeZone.getDefault();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
sdf.setTimeZone(tz);
Calendar cal = Calendar.getInstance(tz);
cal.set(2008, 0, 1, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
for ( int i = 0; i < 355; i++ ) {
    System.out.println(sdf.format(cal.getTime()));
    cal.add(Calendar.DAY_OF_MONTH, 1);
}

Lors de l'exécution dans mon fuseau horaire par défaut (Est des États-Unis), la sortie ressemble à ce que je ferais attendez-vous à:

01/01/2008 00:00:00 EST
01/02/2008 00:00:00 EST
01/03/2008 00:00:00 EST
01/04/2008 00:00:00 EST
...

Et quand je passe à l'heure d'été, j'obtiens

03/10/2008 00:00:00 EDT
03/11/2008 00:00:00 EDT
03/12/2008 00:00:00 EDT

Lorsque j'utilise un fuseau horaire qui observe l'heure d'été de l'Europe de l'Est (dans ce cas, j'ai choisi le fuseau horaire Afrique/Caire), j'obtiens la sortie:

01/01/2008 00:00:00 EET
01/02/2008 00:00:00 EET
01/03/2008 00:00:00 EET
01/04/2008 00:00:00 EET
01/05/2008 00:00:00 EET

Mais quand je passe à l'heure d'été de l'Europe de l'Est, je reçois:

04/25/2008 01:00:00 EEST
04/26/2008 01:00:00 EEST
04/27/2008 01:00:00 EEST

Et étrangement quand EEST se termine, je reçois toujours

08/29/2008 01:00:00 EET
08/30/2008 01:00:00 EET

Je ne sais pas pourquoi ces fuseaux horaires se comportent différemment et s'il s'agit d'un bug avec le fuseau horaire Africa/Cairo, ou si je suis malentendu comment les fuseaux horaires de travail...

Tout aperçu de cela serait apprécié.

Author: Jeff Storey, 2012-02-08

1 answers

Le fuseau horaire du Cairepasse à l'heure d'été à minuit - donc l'heure entre minuit le 25 avril 2008 a été ignorée... les horloges murales sont allées:

04/24/2008 23:59:58
04/24/2008 23:59:59
04/25/2008 01:00:00
04/25/2008 01:00:01

Essayez d'ajouter un jour à la fois à partir de 2h du matin dans le fuseau horaire de l'Est des États - Unis et vous verrez la même chose-cela passera à 03h00 à un moment donné.

Ce que vous essayez de réaliser exactement n'est pas clair-j'ai tendance à penser qu'il est préférable d'ajouter "un certain nombre de millisecondes expérimentées" à une date/heure dans un un fuseau horaire particulier, ou ajoutez "un nombre de millisecondes logiques" à une date/heure locale, qui ne prend pas en compte les fuseaux horaires. Lorsque vous passez de l'heure locale à l'heure dans une zone spécifique, vous devez considérer la possibilité d'ambiguïté (une heure locale se produisant deux fois) ou de sauter (une heure locale ne se produisant pas du tout).

Pour plus de plaisir, l'année dernière, Samoa a complètement sauté le 30 décembre, en raison du changement de fuseau horaire de -14 à +10...

EDIT: Oh, et mon standard la recommandation s'applique: fossé java.util.Calendrier/agenda, et aller avec Joda Time

 3
Author: Jon Skeet, 2012-02-07 22:08:14