2009-02-24 6 views
4

Est-il possible d'obtenir l'horodatage de transition DST précédent et suivant avec l'API Java Calendar/Date/TimeZone?
Avec Joda-Time Je peux écrire:Trouver l'horodatage de transition DST avec java.util.TimeZone

DateMidnight today = new DateMidnight(2009, 2, 24); 
DateTimeZone zone = today.getZone(); 

DateTime previousTransition = 
    new DateTime(zone.previousTransition(today.getMillis())); 
// 2008-10-26T02:59:59.999+02:00 for Europe/Berlin 
System.out.println(previousTransition); 

DateTime nextTransition = 
    new DateTime(zone.nextTransition(today.getMillis())); 
// 2009-03-29T03:00:00.000+02:00 for Europe/Berlin 
System.out.println(nextTransition); 

Y at-il moyen de le faire avec les API Java standard?

Répondre

3

Il n'y a pas une telle fonctionnalité en java Date/Calendrier/TimeZone API

+0

Il est en Java 8, voir ma réponse – Gov

4

Le meilleur que je suis venu avec, quand je avais besoin cette fonctionnalité, est d'utiliser un calendrier et itérer année entière, dans la zone de temps spécifiée, et demander si chaque heure de chaque jour est-ce la mendicité ou la fin de l'heure d'été?

Vous devez le faire comme cela car sur la JVM de Sun, l'implémentation de TimeZone (sun.util.calendar.ZoneInfo) contient des données sur les transitions de fuseaux horaires sous une forme «compilée».

code ressemble à ceci:

public class Dst { 
    Date start; 
    Date end; 

    public static Dst calculate(TimeZone tz, int year) { 
     final Calendar c = Calendar.getInstance(tz); 
     c.setLenient(false); 
     c.set(year, Calendar.JANUARY, 1, 1, 0, 0); 
     c.set(Calendar.MILLISECOND, 0); 

     if (tz.getDSTSavings() == 0) { 
      return null; 
     } 

     Dst dst = new Dst(); 

     boolean flag = false; 

     do { 
      Date date = c.getTime(); 
      boolean daylight = tz.inDaylightTime(date); 

      if (daylight && !flag) { 
       flag = true; 
       dst.start = date; 
      } 
      else if (!daylight && flag) { 
       flag = false; 
       dst.end = date; 
      } 

      c.add(Calendar.HOUR_OF_DAY, 1); 
     } 
     while (c.get(Calendar.YEAR) == year); 

     return dst; 
    } 
} 

Bien sûr, il serait logique de cache/memoize le résultat de ces calculs, etc.

Hope this helps.

+0

Cette approche est risquée, car certains fuseaux horaires ont eu heure d'été double, où ils vont de la norme à l'été, puis de l'été à été double (en général 2 heures). Le code ci-dessus n'attraperait pas ces transitions supplémentaires. – JodaStephen

1

Oui, il existe un moyen indirect de récupérer ceci à partir de l'API Java. Check this out et laissez-moi savoir si cela fonctionne pour le problème:

http://monisiqbal.blogspot.com/2009/12/retrieving-time-zones-dst-information.html

Cela devrait vous donner les informations requises pour l'année en cours, vous pouvez facilement faire la même chose pour les années précédentes si vous voulez.

+0

ne fonctionne pas avec le fuseau horaire 'Europe/Berlin'. 'System.out.println (TimeZone.getTimeZone (" Europe/Berlin "))' imprime * ... startMonth = 2, startDay = -1, ... endMonth = 9, endDay = -1 ... " * Et il n'y a que la date, ** pas de temps ** -> vote bas –

+0

Il est également mauvais de s'appuyer sur le résultat d'une méthode toString() pour des calculs importants Les Javadocs ne définissent pas explicitement le format de cette méthode Cela signifie que cela peut varier en fonction de l'implémentation de la machine virtuelle ou de la modification d'une future version Java. – Michael

Questions connexes