gpt4 book ai didi

java - Joda-Time 到 java.time 迁移 'fromDateFields()'

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:30 25 4
gpt4 key购买 nike

我们目前正在从 Joda-Time 迁移到 java.time。我对 fromDateFields() 方法有以下疑问。旧的 joda 代码:

Date date = new Date(); //some java Date
LocalDateTime lt = LocalDateTime.fromDateFields(date);

一位同事将其迁移到以下行(java.time 代码):

lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

这样对吗? Joda-Time docs像这样描述方法 fromeDateFields:

Constructs a LocalDateTime from a java.util.Date using exactly the same field values.

Each field is queried from the Date and assigned to the LocalDateTime. This is useful if you have been using the Date as a local date, ignoring the zone.

达到相同结果的正确方法是什么?

更新(刚刚找到如下解决方案):

lt= LocalDateTime.from(date.toInstant());

最佳答案

我查看了 Joda-Time 源代码,fromDateFields 方法使用 java.util.Date 中的 getXXX 方法来获取值对于日期/时间字段。类似的东西(我正在使用 Joda-Time 2.9.9):

return new LocalDateTime(
date.getYear() + 1900,
date.getMonth() + 1,
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
(((int) (date.getTime() % 1000)) + 1000) % 1000
);

如果您查看 javadoc ,您会看到所有这些方法都返回相应的值以本地时区解释。这意味着使用 JVM 默认时区是隐式

实际上,看着 Date source code ,所有的getter调用normalize(),这是一个使用默认时区转换字段的方法。

你说过我个人不喜欢时区部分,但在 Joda-Time 中,它是隐式/间接使用默认时区。

使用区域是有意义的,因为 java.util.Date represents a point in the timeline (a specific instant) , 没有任何时区信息。同一时刻可以对应世界不同地区的不同日期和时间,因此您需要一个时区来进行这种转换。

Joda-Time 使用 Date::getXXX 方法,它隐含地使用默认时区。但在 java.time 中,事情必须更加明确,因此您必须使用 ZoneId 对象。

顺便说一下,您的解决方案 (LocalDateTime.from(date.toInstant())) 对我不起作用。在 Java 8 中,它给出了一个错误:

java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2018-02-01T10:50:16.882Z of type java.time.Instant

因此您需要将Date 转换为Instant,然后告知您想要的时区,然后获取本地部分,就像您已经在做:

LocalDateTime dt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

或者:

// the result is the same
LocalDateTime dt = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

虽然 java.time 强制您使用时区,但我相信这是一件好事,因为它让您思考它,而不是在幕后做一些“魔术”。

如果需要,您甚至可以将其更改为其他时区(例如 ZoneId.of("America/New_York"))。即使您最终使用 JVM 的默认设置,这也是一个良心的选择 - 理想情况下,因为有些人只是使用默认设置而不考虑它。

关于java - Joda-Time 到 java.time 迁移 'fromDateFields()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com