将org.joda.time迁移到java.time并设置时区

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

我想迁移这段代码:

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();
吗?

java jodatime
1个回答
0
投票

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 页面开始

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