从 Joda 时间库迁移到 Java 时间 (Java 8)
migrate from Joda time library to Java time (Java 8)
我们的软件架构师决定从我们的项目依赖项中删除 Joda 时间库,并使用 Java 8 时间的功能。我正在研究我们的项目,我试图找到我们使用 Joda 时间库的所有地方,并确定我们实际使用的是什么(joda LocalDate
、DateTime
等)。
我不是Joda时间库的专家,我也不是Java8时间的专家,所以我有一些问题:
在代码中我看到了很多这样的地方:
DateTime jodaDateTime = new DateTime();
doSomething(jodaDateTime.toDate());
我有点困惑。
(Q1) 使用joda有意义吗
DateTime
在这种特殊情况下?我相信,我们可以只使用经典 java.util.Date
而不需要 Joda:
java.util.Date date = new Date();
doSomething(date);
正确吗?
另外,我看到了这段代码:
org.joda.time.DateTime jodaDateTime = new DateTime();
org.joda.time.DateTime jodaDateTimeInPast = jodaDateTime.minusSeconds(60);
doSomething(jodaDateTimeInPast.toDate());
我认为,java 8 时间 API 为计算过去的任何日期提供了强大的支持,所以我知道如何将上面的代码替换为 Java 8:
LocalDatetime java8DateTime = LocalDateTime.now();
LocaldateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
Date java8Date = Date.from(java8DateTimeInPast.atZone(ZoneId.systemDefault()).toInstant());
doSomething(java8Date);
(Q2) 我做对了吗?我不确定 100%。
我刚刚发现这个 link 和 table: "Converting from Joda-Time to java.time"
我找到了一些信息,我需要使用 java.time.ZonedDateTime
或 java.time.OffsetDateTime
类,而不是 java.time.LocalDateTime
,因为 LocalDateTime
-
Same concept - date and time without time-zone
请确认我的重构是正确的(针对 Q1 和 Q2)。
这两种情况你都做得对。我可能要补充的唯一评论是 java 8 时间取代了 java.util.Date,因此您可能想考虑将方法 doSomething(java.util.Date) 替换为 doSomething(java.time.temporal.TemporalAccessor)。但是,java.util.Date 尚未被声明为 depricated,因此您不必这样做。以我的经验,java8次套餐是非常灵活全面的套餐。我在 Joda 中发现了一些有趣的错误,尽管 Joda 在当时是一个很好的包。
大多数关于转换的问题应该由我的 blog 处理。
Q1a:
创建一个 Joda-Time 对象只是为了变回 java.util.Date
是没有意义的。但是,该方法应该可能采用 Instant
或 ZonedDateTime
:
Instant instant = Instant.now();
doSomething(instant); // method changed to take Instant
请注意 Instant
是最接近 java.util.Date
的匹配项。
Q1b:
本例涉及一个time-zone,所以应该用ZonedDateTime
.
ZonedDateTime java8DateTime = ZonedDateTime.now(); // uses ZoneId.systemDefault()
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
doSomething(java8DateTimeInPast.toInstant());
同样,这假定 doSomething
更改为采用 Instant
。
正确使用java.time
的关键是考虑每条数据的正确数据类型。
- 只是约会?然后使用
LocalDate
- 就一次?然后使用
LocalTime
- 日期、时间和time-zone?然后使用
ZonedDateTime
- 只是一个没有其他信息的时间戳?然后使用
Instant
- 具有偏移量(不是区域)的网络 date-time 格式?然后使用
OffsetDateTime
.
我们的软件架构师决定从我们的项目依赖项中删除 Joda 时间库,并使用 Java 8 时间的功能。我正在研究我们的项目,我试图找到我们使用 Joda 时间库的所有地方,并确定我们实际使用的是什么(joda LocalDate
、DateTime
等)。
我不是Joda时间库的专家,我也不是Java8时间的专家,所以我有一些问题:
在代码中我看到了很多这样的地方:
DateTime jodaDateTime = new DateTime();
doSomething(jodaDateTime.toDate());
我有点困惑。
(Q1) 使用joda有意义吗
DateTime
在这种特殊情况下?我相信,我们可以只使用经典 java.util.Date
而不需要 Joda:
java.util.Date date = new Date();
doSomething(date);
正确吗?
另外,我看到了这段代码:
org.joda.time.DateTime jodaDateTime = new DateTime();
org.joda.time.DateTime jodaDateTimeInPast = jodaDateTime.minusSeconds(60);
doSomething(jodaDateTimeInPast.toDate());
我认为,java 8 时间 API 为计算过去的任何日期提供了强大的支持,所以我知道如何将上面的代码替换为 Java 8:
LocalDatetime java8DateTime = LocalDateTime.now();
LocaldateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
Date java8Date = Date.from(java8DateTimeInPast.atZone(ZoneId.systemDefault()).toInstant());
doSomething(java8Date);
(Q2) 我做对了吗?我不确定 100%。
我刚刚发现这个 link 和 table: "Converting from Joda-Time to java.time"
我找到了一些信息,我需要使用 java.time.ZonedDateTime
或 java.time.OffsetDateTime
类,而不是 java.time.LocalDateTime
,因为 LocalDateTime
-
Same concept - date and time without time-zone
请确认我的重构是正确的(针对 Q1 和 Q2)。
这两种情况你都做得对。我可能要补充的唯一评论是 java 8 时间取代了 java.util.Date,因此您可能想考虑将方法 doSomething(java.util.Date) 替换为 doSomething(java.time.temporal.TemporalAccessor)。但是,java.util.Date 尚未被声明为 depricated,因此您不必这样做。以我的经验,java8次套餐是非常灵活全面的套餐。我在 Joda 中发现了一些有趣的错误,尽管 Joda 在当时是一个很好的包。
大多数关于转换的问题应该由我的 blog 处理。
Q1a:
创建一个 Joda-Time 对象只是为了变回 java.util.Date
是没有意义的。但是,该方法应该可能采用 Instant
或 ZonedDateTime
:
Instant instant = Instant.now();
doSomething(instant); // method changed to take Instant
请注意 Instant
是最接近 java.util.Date
的匹配项。
Q1b:
本例涉及一个time-zone,所以应该用ZonedDateTime
.
ZonedDateTime java8DateTime = ZonedDateTime.now(); // uses ZoneId.systemDefault()
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
doSomething(java8DateTimeInPast.toInstant());
同样,这假定 doSomething
更改为采用 Instant
。
正确使用java.time
的关键是考虑每条数据的正确数据类型。
- 只是约会?然后使用
LocalDate
- 就一次?然后使用
LocalTime
- 日期、时间和time-zone?然后使用
ZonedDateTime
- 只是一个没有其他信息的时间戳?然后使用
Instant
- 具有偏移量(不是区域)的网络 date-time 格式?然后使用
OffsetDateTime
.