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
- temps UTC en millisecondes que je peux obtenir avec
System.currentTimeMillis()
- Décalage horaire
- é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
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