Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java.util.TimeZone查找DST转换时间戳_Java_Jodatime - Fatal编程技术网

使用java.util.TimeZone查找DST转换时间戳

使用java.util.TimeZone查找DST转换时间戳,java,jodatime,Java,Jodatime,是否可以使用Java日历/日期/时区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-

是否可以使用Java日历/日期/时区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做到这一点?

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

当我需要这样的功能时,我想到的最好办法是使用日历,在指定的时区内迭代一整年,并询问每天的每一个小时是否都是DST的乞讨或结束

您必须这样做,因为在Sun的JVM上,时区的实现(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;
    }
}
当然,缓存/记忆这些计算的结果是有意义的


希望这能有所帮助。

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


这将为您提供当前年份所需的信息,如果您愿意,您可以轻松地为前几年提供相同的信息。

使用Java 8,您可以使用

ZoneRules#nextTransition(Instant) 
&

方法来做同样的事情


这种方法是有风险的,因为一些时区有双倍的夏季时间,从标准到夏季,然后从夏季到双倍夏季(通常+2小时)。上面的代码无法捕获这些额外的转换。不适用于时区“欧洲/柏林”
System.out.println(TimeZone.getTimeZone(“欧洲/柏林”)
prints…startMonth=2,startDay=-1,…endMonth=9,endDay=-1…”并且只有日期,没有时间->向下投票。依赖toString()的结果也是不好的做法方法进行重要的计算。Javadocs没有明确定义此字符串的格式。这意味着它可能会因VM实现的不同而有所不同,或者在未来的Java版本中有所变化。在Java 8中,有一些问题,请参阅我的答案
ZoneRules#previousTransition(Instant)