2010-11-08 24 views
8

Je fais l'horloge analogique dans Java Swing. Pour calculer les angles de pointeur d'horloge j'ai besoin:Obtenez des économies réelles DST en millisecondes

  1. temps UTC en millisecondes que je peux obtenir avec System.currentTimeMillis()
  2. Décalage horaire
  3. économies TimeZone DST.

Pour 2) et 3) Je pensais que l'utilisation TimeZone.getDefault().getRawOffset() et TimeZone.getDefault().getDSTSavings().

Mais getDSTSavings() renvoie toujours 3600000, quelle que soit la date actuelle est en hiver/heure d'été.
Il semble qu'il vérifie uniquement si cette zone est sous DST gestion et si tel est le cas, il renvoie 3600000 sinon 0. Est-ce un bug dans getDSTSavings()?
Si non alors seul moyen d'obtenir la correction actuelle DST en millisecondes est d'utiliser l'instance de calendrier comme: Calendar.getInstance.get(Calendar.DST_OFFSET)?

Calendar cal1 = Calendar.getInstance(TimeZone.getDefault());  //currentZone: CET/CEST +1/+2, GMT+1:00 
System.out.println("System time, " + System.currentTimeMillis()); //UTC current milis 
System.out.println("Calendar time, " + cal1.getTime().getTime()); //UTC current milis 
System.out.println("Calendar milis, " + cal1.getTimeInMillis());  //UTC current milis 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); 
System.out.println(""); 

// Winter time, CET 
cal1.set(2010, 11, 15, 14, 15, 5); 
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 0 correct 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 wrong !!! 
System.out.println(""); 

// Summer time - CEST 
cal1.set(2010, 8, 15, 14, 15, 5); 
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC 
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 3600000 correct 
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct 
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 correct 

Répondre

12

Voici un exemple de la façon dont l'heure d'été est utilisé:

TimeZone london = TimeZone.getTimeZone("Europe/London"); 
System.out.println(london.getOffset(date.getTime())); 

Cela 3600000 imprimer si l'heure d'été est en vigueur à Londres à la date indiquée. Sinon, il affichera 0.

+3

Oui, c'est ce que je cherchais. Le décalage est juste dépendant de la zone et du temps. Maintenant, je n'ai pas besoin de créer une nouvelle instance de calendrier à chaque tick. Au lieu de cela, il suffit de détecter la zone actuelle lors du démarrage de l'horloge. final Fuseau horaire timeZone = TimeZone.getDefault(); final long utcTime = System.currentTimeMillis(); final long timeOffset = timeZone.getOffset (utcTime); final long t = utcTime + timeOffset; – zlatanmomic

2

L'instance cal1 que vous récupérez sur la première ligne est en GMT + 1 et ne change pas quelle que soit l'heure et la date que vous avez définies. Si vous devez vérifier le fuseau horaire actuel à chaque tick de l'horloge, vous devrez récupérer une nouvelle instance de Calendar à chaque tick.

En note, si vous êtes prêt à ajouter une dépendance à votre projet - Joda Time est une magnifique bibliothèque de date et heure.