2009-09-19 7 views
15

Ich würde gerne die einfachste Möglichkeit, in Java, um eine Liste von Daten in der Zukunft, wo Sommerzeit wird sich ändern.Holen Sie sich die Sommerzeit Übergangszeiten für Zeitzonen in Java

Eine ziemlich uneigentliche Art, dies zu tun, wäre, einfach über eine Reihe von Jahren Tage zu iterieren, sie gegen TimeZone.inDaylightTime() zu testen. Das wird funktionieren, und ich mache mir keine Sorgen um Effizienz, da dies nur jedes Mal ausgeführt werden muss, wenn meine App startet, aber ich frage mich, ob es einen einfacheren Weg gibt.

Wenn Sie sich fragen, warum ich das mache, liegt es daran, dass ich eine Javascript-App habe, die mit Daten von Drittanbietern umgehen muss, die UTC-Zeitstempel enthalten. Ich möchte eine zuverlässige Möglichkeit, auf der Client-Seite von GMT zu EST zu übersetzen. Siehe Javascript -- Unix Time to Specific Time Zone Ich habe etwas Javascript geschrieben, das es tun wird, aber ich möchte genaue Übergangsdaten vom Server erhalten.

+2

Siehe diese Frage: http://stackoverflow.com/questions/581581/find-dst-transition-timestamp-with-java-util-timezone –

Antwort

28

Joda Time (wie immer) macht dies wirklich einfach wegen der DateTimeZone.nextTransition Methode. Zum Beispiel:

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test 
{  
    public static void main(String[] args) 
    { 
     DateTimeZone zone = DateTimeZone.forID("Europe/London");   
     DateTimeFormatter format = DateTimeFormat.mediumDateTime(); 

     long current = System.currentTimeMillis(); 
     for (int i=0; i < 100; i++) 
     { 
      long next = zone.nextTransition(current); 
      if (current == next) 
      { 
       break; 
      } 
      System.out.println (format.print(next) + " Into DST? " 
           + !zone.isStandardOffset(next)); 
      current = next; 
     } 
    } 
} 

Ausgang:

 
25-Oct-2009 01:00:00 Into DST? false 
28-Mar-2010 02:00:00 Into DST? true 
31-Oct-2010 01:00:00 Into DST? false 
27-Mar-2011 02:00:00 Into DST? true 
30-Oct-2011 01:00:00 Into DST? false 
25-Mar-2012 02:00:00 Into DST? true 
28-Oct-2012 01:00:00 Into DST? false 
31-Mar-2013 02:00:00 Into DST? true 
27-Oct-2013 01:00:00 Into DST? false 
30-Mar-2014 02:00:00 Into DST? true 
26-Oct-2014 01:00:00 Into DST? false 
29-Mar-2015 02:00:00 Into DST? true 
25-Oct-2015 01:00:00 Into DST? false 
... 

Mit Java 8 können Sie die gleichen Informationen erhalten ZoneRules mit seinen nextTransition und previousTransition Methoden.

+0

+1 für die "Probe kommen" Idee (sowie den Rest (Antwort natürlich) – akf

+0

Natürlich ist es so spekulativ, so weit voraus zu projizieren. Die USA haben in letzter Zeit mit den DST-Daten gebastelt, und vielleicht schon wieder. – brianary

+0

In diesem Jahr ist der erste Termin für die Umstellung auf die Sommerzeit der 14. März 2010 (was vor ein paar Tagen geschah). Aber dein Skript gibt 28-Mar-2010 an. Fehle ich etwas? –