4

是否可以使用 Java Calendar/Date/TimeZone API 获取上一个和下一个 DST 转换时间戳?
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);

有没有办法使用标准的 Java API 来做到这一点?

4

4 回答 4

4

java Date/Calendar/TimeZone API 中没有这样的功能

于 2009-02-24T12:40:34.547 回答
4

当我需要这样的功能时,我想出的最好的方法是使用日历并在指定的时区遍历整年,并询问每天的每个小时是 DST 的开始还是结束。

您必须这样做,因为在 Sun 的 JVM 上,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;
    }
}

当然,缓存/记忆这些计算的结果等是有意义的。

希望这可以帮助。

于 2009-02-24T13:53:56.807 回答
2

使用 Java 8,您可以使用

ZoneRules#nextTransition(Instant) 

&

ZoneRules#previousTransition(Instant) 

做同样事情的方法。

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

于 2017-05-05T01:16:10.860 回答
1

是的,有一种间接的方法可以从 Java API 中检索它。检查一下,让我知道这是否适用于问题:

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

这应该为您提供当年所需的信息,如果您愿意,您可以轻松地为前几年做同样的事情。

于 2010-02-01T10:33:23.887 回答