从Joda时间库迁移到Java时间(Java 8)

时间:2016-01-27 17:13:26

标签: java-8 refactoring jodatime java-time

我们的软件架构师决定从项目依赖项中删除Joda时间库,并使用Java 8时间的功能。我正在研究我们的项目,我正在尝试找到我们使用Joda time lib的所有地方,并确定我们实际使用的是什么(joda LocalDateDateTime等。)。 > 我不是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.ZonedDateTimejava.time.OffsetDateTime类,而不是java.time.LocalDateTime,因为LocalDateTime -

  

相同的概念 - 没有时区的日期和时间

请确认我的重构是正确的( Q1 Q2 )。

2 个答案:

答案 0 :(得分:7)

关于转化的大多数问题都应由我的blog处理。

Q1A: 创建Joda-Time对象只是为了更改回java.util.Date没有意义。但是,该方法应该概率为InstantZonedDateTime

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在当时是一个很好的包装。