Domanda

E 'possibile ottenere il timestamp di transizione precedente e successivo DST con il calendario di Java / data / TimeZone API?
Con Joda-Time posso scrivere:

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

C'è modo per farlo con le API standard di Java?

È stato utile?

Soluzione

Non esiste una funzionalità in Java Data / Calendario / TimeZone API

Altri suggerimenti

Il migliore mi è venuta, quando avevo bisogno di tale funzionalità, è quello di utilizzare un calendario e scorrere tutto l'anno, nel fuso orario specificato, e chiedere se ogni ora di ogni giorno è l'accattonaggio o la fine dell'ora legale.

Devi farlo così perché sulla JVM di Sun, l'attuazione di TimeZone (sun.util.calendar.ZoneInfo) contiene i dati sulle transizioni di fuso orario in un certo tipo di forma "compilato".

Codice va qualcosa come questo:

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

Naturalmente, non avrebbe molto senso per cache / Memoize il risultato di questi calcoli, ecc.

Spero che questo aiuti.

Con Java 8 è possibile utilizzare il

ZoneRules#nextTransition(Instant) 

&

ZoneRules#previousTransition(Instant) 

metodi per fare la stessa cosa.

https://docs.oracle .com / JavaSE / 8 / docs / api / java / ora / orario / ZoneRules.html

Sì, c'è un modo indiretto per recuperare questo da API Java. Check this out e fatemi sapere se questo funziona per il problema:

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

Questo dovrebbe dare le informazioni richieste per l'anno in corso, si può facilmente fare lo stesso per gli anni precedenti, se si desidera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top