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

use*_*011 4 refactoring jodatime java-8 java-time

我们的软件架构师决定从项目依赖项中删除Joda时间库,并使用Java 8时间的功能.我在做我们的项目的研究,我想找到,我们正在使用乔达时间lib中的所有地方,并确定我们使用的究竟是什么(乔达LocalDate,DateTime等等).
我不是Joda时间库的专家,我不是Java 8时间的专家,所以我有一些问题:
在代码中我看到很多这样的地方:

DateTime jodaDateTime = new DateTime();
doSomething(jodaDateTime.toDate()); 
Run Code Online (Sandbox Code Playgroud)

我有点困惑.

(Q1)DateTime在这种特殊情况下使用joda是否有意义 ?我相信,我们可以使用经典java.util.Date,我们不需要Joda:

java.util.Date date = new Date();
doSomething(date);
Run Code Online (Sandbox Code Playgroud)

正确?

另外,我看到了这段代码:

org.joda.time.DateTime jodaDateTime = new DateTime();
org.joda.time.DateTime jodaDateTimeInPast = jodaDateTime.minusSeconds(60);
doSomething(jodaDateTimeInPast.toDate());
Run Code Online (Sandbox Code Playgroud)

我认为,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);
Run Code Online (Sandbox Code Playgroud)

(Q2)我是否以正确的方式完成了它?我不确定100%.我刚刚发现这个链接有一个表:" 从Joda-Time转换为java.time "有我发现的信息,我需要使用java.time.ZonedDateTimejava.time.OffsetDateTime类,但不是java.time.LocalDateTime,因为LocalDateTime-

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

请确认我的重构是正确的(Q1Q2).

Jod*_*hen 7

关于转换的大多数问题都应由我的博客处理.

Q1a:创建一个Joda-Time对象只是为了改回来是没有意义的java.util.Date.但是,该方法应该采用Instant或者ZonedDateTime:

Instant instant = Instant.now();
doSomething(instant);  // method changed to take Instant
Run Code Online (Sandbox Code Playgroud)

请注意,这Instant是最接近的匹配java.util.Date.

Q1b:这个案例涉及一个时区,所以应该使用ZonedDateTime.

ZonedDateTime java8DateTime = ZonedDateTime.now();  // uses ZoneId.systemDefault()
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60);
doSomething(java8DateTimeInPast.toInstant());
Run Code Online (Sandbox Code Playgroud)

同样,这假设doSomething改为采取Instant.

java.time正确使用的关键是考虑每个数据的数据类型是否正确.

  • 约会?然后用LocalDate
  • 只是一次?然后用LocalTime
  • 日期,时间和时区?然后用ZonedDateTime
  • 只是一个没有其他信息的时间戳?然后用Instant
  • 具有偏移(不是区域)的网络日期时间格式?然后用OffsetDateTime.

  • `java.util.Date`上的`toString()`返回本地时区的时间.但是对象的状态并不成立.理解这种差异是理解`java.util.Date`的关键. (3认同)