【问题标题】: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可以检查时间段里面是否有夏令时?

【问题讨论】:

  • @MicSim,谢谢,但问题是关于 JodaTime 标准 API。我正在寻找单线,而不是针对 unix 时间的长算术。

标签: java datetime date jodatime dst


【解决方案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?
    猜你喜欢
    • 2023-03-18
    • 2021-06-22
    • 2018-04-22
    • 2012-11-25
    • 1970-01-01
    • 2018-12-12
    • 2014-10-27
    • 2020-06-09
    • 2011-03-19
    相关资源
    最近更新 更多