Question

Est-il possible d'obtenir le précédent et suivant horodatage de transition DST avec le calendrier Java / Date / API TimeZone
Avec Joda-Time Je peux écrire:

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?

Était-ce utile?

La solution

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

Autres conseils

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-il mendiait ou la fin de l'heure d'été.

Vous devez le faire comme ça parce que sur la JVM de Sun, la mise en œuvre de TimeZone (sun.util.calendar.ZoneInfo) contient des données sur les transitions de fuseau horaire dans une sorte de forme « compilé ».

Code va quelque chose comme 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.

Avec Java 8, vous pouvez utiliser la balise

ZoneRules#nextTransition(Instant) 

&

ZoneRules#previousTransition(Instant) 

méthodes pour faire la même chose.

https://docs.oracle .com / JavaSE / 8 / docs / api / java / heure / zone / ZoneRules.html

Oui, il existe un moyen indirect pour récupérer ce billet depuis 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top