2009-09-19 15 views
15

Mi piacerebbe sapere il modo più semplice, in Java, per ottenere un elenco di date in futuro in cui l'ora legale cambierà.Ottieni le date di transizione per l'ora legale per i fusi orari in Java

Un modo abbastanza poco elegante per farlo sarebbe quello di ripetere semplicemente un paio di anni di giorni, verificandoli con TimeZone.inDaylightTime(). Questo funzionerà, e non sono preoccupato per l'efficienza poiché questo dovrà essere eseguito solo ogni volta che si avvia la mia app, ma mi chiedo se c'è un modo più semplice.

Se ti stai chiedendo perché sto facendo questo, è perché ho un'app javascript che deve gestire i dati di terze parti contenenti timestamp UTC. Voglio un modo affidabile per tradurre da GMT a EST sul lato client. Vedi Javascript -- Unix Time to Specific Time Zone Ho scritto qualche javascript che lo farà, ma voglio ottenere precise date di transizione dal server.

+2

Vedere questa domanda: http://stackoverflow.com/questions/581581/find-dst-transition-timestamp-with-java-util-timezone –

risposta

28

Joda Time (come sempre) rende questo molto facile grazie al metodo DateTimeZone.nextTransition. Per esempio:

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; 
     } 
    } 
} 

uscita:

 
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 
... 

con Java 8, è possibile ottenere le stesse informazioni utilizzando ZoneRules con i suoi nextTransition e previousTransition metodi.

+0

+1 per l'idea di "campione in arrivo" (così come il resto di risposta, ovviamente) – akf

+0

Ovviamente, proiettarsi molto più avanti è piuttosto speculativo. Gli Stati Uniti hanno armeggiato con le date dell'ora legale di recente, e possono di nuovo. – brianary

+0

Quest'anno la prima data di transizione all'ora legale è il 14 marzo 2010 (avvenuta alcuni giorni fa). Ma il tuo script specifica 28-mar-2010. Mi sto perdendo qualcosa ? –