JodaTime - 我怎么知道夏令时是不是在指定的时间段内发生?

Posted

技术标签:

【中文标题】JodaTime - 我怎么知道夏令时是不是在指定的时间段内发生?【英文标题】:JodaTime - how can I know whether a daylight saving occurs within a specified period of time?JodaTime - 我怎么知道夏令时是否在指定的时间段内发生? 【发布时间】:2012-07-08 13:06:21 【问题描述】:

我需要知道周期是否由:

DateTime start;
DateTime end;

里面有夏令时。

我正在迭代 start,end 定义的周期集合,并在每次迭代中将开始和结束时间向前移动 24 小时。生成的周期从午夜开始,到下一个午夜前 1 毫秒结束。我发现如果时段内有夏令时点会产生不正确的结果,例如:

拥有:

Duration targetDuration = new Duration(24*60*60*1000L-1);
DateTime start = new DateTime("2012-03-10T00:00:00.000-08:00");
DateTime end = new DateTime("2012-03-10T23:59:59.999-08:00");   

那么班次就完成了:

start = end.plusMillis(1);
end = start.plus(targetDuration);

产生:

start = "2012-03-11T00:00:00.000-08:00"
end = "2012-03-12T00:59:59.999-07:00"   

不知道JodaTime中有没有标准的API可以检查时间段里面是否有夏令时?

【问题讨论】:

见:***.com/a/154765/44522 @MicSim,谢谢,但问题是关于 JodaTime 标准 API。我正在寻找单线,而不是针对 unix 时间的长算术。 【参考方案1】:

使用 DateTimeZone.nextTransition 方法。如果开始时间小于结束日期时间,则其间至少发生了一次时区转换。这不考虑规则更改与 DST。也就是说,一个时区可能有一个新规则,表明标准时间有一个新的偏移量,这将显示为一个时区转换。

if (start.getZone().nextTransition(start.getMillis()) < end.getMillis()) 
    // Time zone transition occurred, possibly due to DST
    ...

【讨论】:

【参考方案2】:

只要startend 位于正确的时区(例如,使用this constructor 创建),那么Interval created using them 就应该考虑该时区的夏令时。如果Duration of that Interval 不等于 24 小时,那么您已经越过了 DST 点。

【讨论】:

对于任意日期,这不是一个好的通用解决方案。如果有多个 DST 转换,则持续时间仍然可以被 24 整除。 我不明白如何在一个 24 小时内有多个 DST 转换,正如所询问的那样。尽管如此,你的确实更适合任意日期。【参考方案3】:

因为夏令时严重依赖于时区(有些地区不实行 DST,有些地区移动时钟 1 小时,有些 2 小时等)您的时间变量也必须考虑位置。

因此,您可能需要查看DateTimeZone

DateTimeZone

【讨论】:

如何帮助处理 DST?

以上是关于JodaTime - 我怎么知道夏令时是不是在指定的时间段内发生?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?

确定夏令时 (DST) 在 Java 中是不是在指定日期处于活动状态

在 Joda Time 的帮助下使用夏令时的正确方法

如何在 Joda Time 中检测模糊的 DST 重叠?

Java - 使用DBUtils BeanListHandler将查询中的所有日期转换为JodaTime的DateTime

确定 DST 是不是对给定 time_t 的指定时区有效