Holen Sie sich aktuelle Sommerzeit Einsparungen in Millisekunden
Ich mache analoge Uhr in Java Swing. Um zu berechnen, Uhr-Zeiger-Winkel, die ich brauche:
- UTC-Zeit in Millisekunden, die ich bekommen kann mit
System.currentTimeMillis()
- TimeZone offset
- TimeZone DST Einsparungen.
Für 2) und 3) habe ich daran gedacht, mit
TimeZone.getDefault().getRawOffset()
und TimeZone.getDefault().getDSTSavings()
.
Aber getDSTSavings()
gibt immer 3600000
unabhängig vom aktuellen Datum wird im winter/Sommer Zeit.
Es sieht aus wie es nur prüft, ob dieser zone ist unter DST
- management und wenn ja, gibt es 3600000
sonst 0
.
Ist das ein bug in getDSTSavings()
?
Wenn nicht, dann nur so bekommen Sie aktuelle DST
Korrektur in Millisekunden ist die Verwendung von Kalender-Instanz wie: 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel, wie die Sommerzeit verwendet wird:
Diese wird gedruckt, 3600000, wenn die Sommerzeit in Kraft ist, in London zu dem angegebenen Datum. Sonst wird es drucken Sie 0.
Den cal1-Instanz, die Sie abrufen auf der ersten Zeile wird in GMT+1 und das ändert sich nicht, unabhängig davon, was Zeit /Datum, an dem Sie festgelegt sind. Wenn Sie brauchen, um zu überprüfen, die aktuelle Zeitzone auf jedem ticken der Uhr, müssen Sie zum abrufen einer neuen Kalender-Instanz bei jedem tick.
Als Randbemerkung, wenn Sie bereit sind, fügen Sie eine Abhängigkeit zu Ihrem Projekt - Joda Time ist ein wunderbares Datum und Zeit-Bibliothek.