我想迁移这段代码:
private Resource getRegistrations(DateTime startDate) {
DateTime pageStartDate = (startDate == null) ? null : startDate.withZoneRetainFields(DateTimeZone.UTC);
return ........;
}
对此:
private Resource getRegistrations(OffsetDateTime startDate) {
OffsetDateTime pageStartDate = (startDate == null) ? null : startDate.atZoneSameInstant(ZoneId.of("UTC")).toOffsetDateTime();
return null;
}
这是设置时区的正确方法
atZoneSameInstant(ZoneId.of("UTC")).toOffsetDateTime();
吗?
号
withZoneRetainFields
保留“字段”——年、月、日、小时、分钟——这些都是字段。通过更改时区,第一个片段意味着返回的时间戳与输入值不同。鉴于这个名字getRegistrations
,我听起来很像第一个代码是错误的。发生这种情况:你正在重构,你发现了一个错误。
第二个片段保持相同的瞬间。换句话说,如果你有,比如说,“12 月 20 日下午 5 点,在伦敦”,你使用
atZoneSameInstant
来获得 Europe/Amsterdam
区域的时间,你会得到 6 o时钟倒退(因为伦敦是 5 点,阿姆斯特丹是 6 点,阿姆斯特丹的时区比英国早 1 小时)。
第一个片段会给你 5 点在阿姆斯特丹,实际上早 1 小时。
请注意,
OffsetDateTime
是您几乎不应该使用的那个。你可能想要ZonedDateTime
。偏移量的问题在于它们根本不映射到任何计算上。计算机不喜欢偏移量(他们喜欢从一个纪元开始的毫秒数),而人类不使用偏移量,他们使用时区。如果它是一个没有夏令时的区域,那没有什么区别,但很多都有。
你的变量也是错误的。为什么一个
DateTime
对象叫做pageStartDate
?
如果您只对dates感兴趣,请使用
LocalDate
。如果它实际上是关于人类推算的特定时间,请使用ZonedDateTime
。如果它是关于计算机系统/原始比较(例如,你只想知道一大堆 em 中的哪个事件比另一个事件“早”,你并不真正关心它发生在哪个日期),然后使用java.time.Instant
.
`ZonedDateTime 页面开始