JodaTime - 如何知道指定时间段内是否发生夏令时?

问题描述 投票:0回答:4

我需要知道该期间是否由以下定义:

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可以检查该时间段内是否有夏令时?

java datetime date jodatime dst
4个回答
4
投票

使用 DateTimeZone.nextTransition 方法。如果开始日期时间小于结束日期时间,则其间至少发生过一次时区转换。这没有考虑到 DST 的规则变化。也就是说,时区可能有一条新规则,指示标准时间有新的偏移量,这将显示为时区转换。

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

2
投票

只要

start
end
位于正确的时区(例如,使用 此构造函数 创建),那么使用它们创建的 Interval 应考虑该时区的 DST。如果该时间间隔的持续时间不等于 24 小时,则您已超过 DST 点。


0
投票

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

因此,您可能需要看看

DateTimeZone
课程

日期时区


0
投票

如果您在名为

DateTimeZone
的变量中有
dateTimeZone
,那么您可以使用
dateTimeZone.isStandardOffset(start.getMillis())
dateTimeZone.isStandardOffset(end.getMillis())
来确定夏令时是否在所表示的时间段内开始或结束。

公共布尔值 isStandardOffset(长瞬时)

检查在特定时刻偏移是否是原始的。 此方法可用于估计指定时刻是否适用夏令时 (DST)。作为一般规则,如果实际偏移量等于指定时刻的原始偏移量,则要么适用冬季时间,要么该区域没有 DST 规则。如果实际偏移量不等于原始偏移量,则适用某种形式的夏令时。

该方法的实现很简单,就是在指定时刻 getOffset(long) 是否等于 getStandardOffset(long) 。

此方法应命名为 isRawOffsetInUse(),但出于兼容性原因不能重命名。

参数: 即时 - 从 1970-01-01T00:00:00Z 开始计算的毫秒数以获得

的偏移量

退货: 如果给定时刻的偏移量与原始偏移量相同,则为 true

自: 1.5

https://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html#isStandardOffset-long-

© www.soinside.com 2019 - 2024. All rights reserved.