使用ZoneId.of("UTC")
而非ZoneOffset.UTC
是否有任何理由?
我们了解两者之间的区别,可以参考什么是ZoneOffset.UTC和ZoneId.of("UTC")之间的区别?
<tl;dr>版本:
ZoneOffset.UTC
返回一个ID为“Z”,偏移为0且默认区域规则的简单ZoneOffset
。ZoneId.of("UTC")
返回一个ID为“UTC”、包含ZoneOffset.UTC
的ZoneRegion
。
</tl;dr>
对于这个问题,我假设只是为了更容易地处理日期和时间而将时区设置为UTC,而不是因为某些实际业务原因需要将其作为实际的ZoneRegion。
例如,在处理ZonedDateTime
时,我发现唯一的区别是打印输出的格式不同。
2021-06-10T15:28:25.000000111Z
2021-06-10T15:28:25.000000111Z[UTC]
我们正在进行代码审查讨论,所以我想这种冲突并不罕见。
以下是我的思考
ZoneOffset.UTC
- 它是一个常量(而且进一步地,它的偏移值(0)甚至被缓存了)。
- 由于缺少区域信息,它具有较少的开销。
- 在UTC中,没有夏令时或历史偏移等要考虑的情况,就像在任何其他时区一样。因此,对于我到目前为止遇到的所有用例(例如将特定区域区域的某个夏令时状态与特定日光节约状态转换),0的偏移量通常足够了。
ZoneId.of("UTC")
- 总的来说,由于一系列额外的位置特定数据(如特定的夏令时或历史时间偏移),ZoneRegions优先于ZoneOffsets。
- 然而,在UTC的情况下,
ZoneId.of("UTC")
只是一个围绕ZoneOffset.UTC
的区域包装器,我到目前为止找不到任何好处。据我所知,在UTC中,除了继承的ZoneOffset.UTC
规则之外,不存在任何区域相关数据。 - 需要每次解析。
因此,我的_猜测_是:
除非您出于某种(例如业务)原因真正需要UTC时区/区域,否则应优先考虑ZoneOffset.UTC
。它在性能上具有(轻微的)优势,并且UTC ZoneRegion似乎没有提供我可以看到或想到的任何好处。
然而,由于Java日期时间API的复杂性,很难确定我在这个讨论中是否遗漏了什么。
有没有任何理由使某人使用ZoneId.of("UTC")
?