2010-01-19 9 views
7

Considérons le code suivant:problème étrange avec le fuseau horaire, le calendrier et SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

Calendar c = Calendar.getInstance(Locale.US); 
c.setTimeInMillis(start); 
System.out.println("Start = " + c.getTime()); 
c.setTimeInMillis(end); 
System.out.println(" End = " + c.getTime()); 

Lorsque vous exécutez cet extrait de code, j'ai la sortie suivante:

Start = Wed Sep 30 10:30:00 CEST 2009 
    End = Fri Oct 30 10:30:00 CET 2009 

Pourquoi suis-je fuseau horaire différent?

Notez que si je mets la première date en août et le second en septembre, la sortie affiche le même fuseau horaire dans les deux cas:

long start = sdf.parse("10:30:00 30/08/2009").getTime(); 
long end = sdf.parse("10:30:00 30/09/2009").getTime(); 

affichera:

Start = Sun Aug 30 10:30:00 CEST 2009 
    End = Wed Sep 30 10:30:00 CEST 2009 

I utilise Java 1.6.0_14

+0

est-il lié à l'interrupteur horaire d'hiver fin octobre? Si oui, comment s'en débarrasser? – romaintaz

+0

Ce n'est pas le cas. Vous pouvez forcer le 'CEST' à' CET' mais cela se traduira par une heure différente (celle d'octobre sera 11:30 au lieu de 10:30). C'est le même que GMT (bien, UTC maintenant) et heure de Londres: quand DST est sur, heure de Londres est techniquement GMT + 1, CET est GMT + 2 etc. – laura

+0

Que voulez-vous accomplir exactement? * Pourquoi pensez-vous que vous devez vous débarrasser de l'heure d'été? –

Répondre

9

CEST est l'heure d'été d'Europe centrale. C'est la même chose que CET avec l'heure d'été en vigueur.

+0

C'est ce que je soupçonnais, mais alors comment puis-je me débarrasser de cette heure d'été? – romaintaz

+0

Pourquoi voulez-vous vous en débarrasser? CET est -01: 00 alors que CEST est -02: 00 (heures de différence par rapport à l'heure GMT, pour laquelle l'heure d'été n'est jamais appliquée). Ceci est la convention pour les fuseaux horaires et vous ne devriez pas le casser. Qu'essayez-vous exactement d'accomplir? Est-ce une présentation ou un problème de calcul? – kgiannakakis

+0

Correction: CET est +1 et CEST est +2 –

0

Oui, il est lié à l'heure d'été. Si vous utilisez un fuseau horaire qui reconnaît l'heure d'été, il sera automatiquement utilisé. Vous pouvez utiliser GMT par exemple si vous ne le souhaitez pas.

6

Vous pouvez définir le fuseau horaire par défaut

import java.util.TimeZone; 
...   
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // or "Etc/GMT-1" 

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US); 
    long start = sdf.parse("10:30:00 30/09/2009").getTime(); 
    long end = sdf.parse("10:30:00 30/10/2009").getTime(); 

    Calendar c = Calendar.getInstance(Locale.US); 
    c.setTimeInMillis(start); 
    System.out.println("Start = " + c.getTime()); 
    c.setTimeInMillis(end); 
    System.out.println(" End = " + c.getTime()); 

utilisation TimeZone.getAvailableIDs() pour voir tous les ID disponibles.

EDIT: vous pouvez également utiliser une nouvelle SimpleTimeZone

TimeZone.setDefault(new SimpleTimeZone(60 * 60 * 1000, "CET")); 
Questions connexes