我们的软件架构师决定从项目依赖项中删除Joda时间库,并使用Java 8时间的功能。我正在研究我们的项目,我正在尝试找到我们使用Joda time lib的所有地方,并确定我们实际使用的是什么(joda LocalDate
,DateTime
等。)。 >
我不是Joda时间库的专家,我不是Java 8时间的专家,所以我有一些问题:
在代码中,我看到很多这样的地方:
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%。
我刚发现这个链接表:“Converting from Joda-Time to java.time”
我找到了一些信息,我需要使用java.time.ZonedDateTime
或java.time.OffsetDateTime
类,而不是java.time.LocalDateTime
,因为LocalDateTime
-
相同的概念 - 没有时区的日期和时间
请确认我的重构是正确的( Q1 和 Q2 )。
答案 0 :(得分:7)
关于转化的大多数问题都应由我的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:
此案例涉及时区,因此应使用ZonedDateTime
。
ZonedDateTime java8DateTime = ZonedDateTime.now(); // uses ZoneId.systemDefault()
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
doSomething(java8DateTimeInPast.toInstant());
同样,这假设doSomething
已更改为Instant
。
正确使用java.time
的关键是考虑每种数据的数据类型是正确的。
LocalDate
LocalTime
ZonedDateTime
Instant
OffsetDateTime
。答案 1 :(得分:2)
你正在为两种情况做正确的事。我可能添加的唯一注释是java 8 time取代了java.util.Date,因此您可能想要用doSomething(java.time.temporal.TemporalAccessor)替换您的方法doSomething(java.util.Date)。但是,java.util.Date还没有被声明为depricated,所以你不必这样做。根据我的经验,java 8时间包是非常灵活和全面的包。我发现Joda有一些有趣的错误,尽管Joda在当时是一个很好的包装。