1

使用创建 OffsetDateTime 对象

  1. ofInstant(instant, zoneid) 或通过
  2. 流畅的界面

如果通过流畅接口的实例化跨越夏令时边界,则可能导致不相等的对象(通过使用 compareTo 断言或比较 ZoneOffset 和 LocalDateTime 字段)。考虑以下示例:

OffsetDateTime inAMonth = OffsetDateTime.now().plusMonths(1);
OffsetDateTime inAMonth2 = OffsetDateTime.ofInstant(inAMonth.toInstant(), ZoneId.systemDefault());

在 10 月中旬的中欧(ZoneId 'Europe/Berlin'),由于plusMonths()重新使用offset初始调用 ( now()),这将产生两个不相等的对象。

有谁知道为什么不重新计算偏移量?

我在单元测试期间遇到了这个问题,我能想出的唯一解决方法是 a) 不使用 fluent 接口或 b) 在使用 fluent 接口时避免使用跨 DST 跳转。不幸的是,使用 OffsetDateTime 以外的东西不是一种选择。

4

2 回答 2

1

有谁知道为什么不重新计算偏移量?

因为OffsetDateTime返回的值OffsetDateTime.now()与任何特定时区无关,只是一个偏移量。偏移量被确定为“系统默认时区的当前偏移量”,但之后与系统默认时区没有关联。

如果您想要一个与时区关联的值,改用ZonedDateTime.now()。您可以将结果ZonedDateTime.now().plusMonths(1)转换为OffsetDateTime之后:

OffsetDateTime inAMonth = ZonedDateTime.now().plusMonths(1).toOffsetDateTime();
于 2020-10-19T10:59:25.330 回答
0

OffsetDateTime.plusMonth永远不要改变偏移量,因为它是一个OffsetDateTime- 一个日期,一个时间,具有恒定的偏移量。如果要更改偏移量,请使用ZonedDateTime, 因为只有区域的偏移量可以更改。

但是,在创建OffsetDateTime使用瞬间和区域时,显然需要在指定瞬间获取指定区域的偏移量。好吧,在指定的时刻,DST 转换已经发生,inAMonth2DST 后转换偏移也发生了。

于 2020-10-19T11:02:12.687 回答