Найти метку времени перехода DST с помощью java.util.TimeZone - PullRequest
4 голосов
/ 24 февраля 2009

Можно ли получить предыдущую и следующую метку времени перехода на летнее время с помощью API Java Calendar / Date / TimeZone? С Joda-Time я могу написать:

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

Есть ли способ сделать это с помощью стандартных API Java?

Ответы [ 4 ]

4 голосов
/ 24 февраля 2009

Лучшее, что мне пришло в голову, когда мне понадобилась такая функциональность, - это использовать Календарь и выполнять итерацию по всему году в указанном часовом поясе и спрашивать, является ли каждый час каждого дня началом или окончанием летнего времени.

Вы должны сделать это так, потому что в JVM от Sun реализация TimeZone (sun.util.calendar.ZoneInfo) хранит данные о переходах часовых поясов в некой «скомпилированной» форме.

Код выглядит примерно так:

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

Конечно, имеет смысл кэшировать / запоминать результаты этих вычислений и т. Д.

Надеюсь, это поможет.

4 голосов
/ 24 февраля 2009

Нет такой функциональности в API Java Date / Calendar / TimeZone

1 голос
/ 05 мая 2017

С Java 8 вы можете использовать

ZoneRules#nextTransition(Instant) 

&

ZoneRules#previousTransition(Instant) 

методы сделать то же самое.

https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html

1 голос
/ 01 февраля 2010

Да, есть косвенный способ получить это из Java API. Проверьте это и дайте мне знать, если это работает для проблемы:

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

Это должно дать вам необходимую информацию для текущего года, вы можете легко сделать то же самое для предыдущих лет, если хотите.

...