DateTime.now() 和 new DateTime(System.currentTimeMillis()) 方法在 java 中是否相等?

Are methods DateTime.now() and new DateTime(System.currentTimeMillis()) equal in java?

我需要知道,在java(我的版本jdk 8)中,我可以替换,new DateTime(System.currentTimeMillis())这个代码形式,'DateTime.now()'?

我使用了包 import org.joda.time.DateTime;

如何在 java 8(日期和时间)中写同样的东西?

在Java8、DateTime maps tojava.time.ZonedDateTimejava.time.OffsetDateTime.

本页由Joda Timecreator/author/maintainer撰写,推荐:

If you are writing code in Java SE 8, its time to migrate to java.time...

是的。 new DateTime(System.currentTimeMillis()) 会打电话给

public DateTime(long instant) {
    super(instant);
}

然后

public BaseDateTime(long instant) {
    this(instant, ISOChronology.getInstance());
}

DateTime.now()会调用

public static DateTime now() {
    return new DateTime();
}

然后

public DateTime() {
    super();
}

然后

public BaseDateTime() {
    this(DateTimeUtils.currentTimeMillis(), ISOChronology.getInstance());
}

与第一种方式相同

是的。

这是相关代码:

public BaseDateTime() {
    this(DateTimeUtils.currentTimeMillis(), ISOChronology.getInstance());
}
public BaseDateTime(long instant) {
    this(instant, ISOChronology.getInstance());
}

tl;博士

java.time.Instant.now()  // Capture the current moment in UTC. 

在内部,时刻被跟踪为整秒计数加上小数秒作为纳秒计数,因为 1970-01-01T00:00:00Z 的纪元参考(Z 表示 UTC) .

java.time

您的 DateTime class 显然来自 Joda-Time 库。该库的创建者 Stephen Colebourne 继续将 Joda-Time 替换为 java.time classes 内置于 Java 8 及更高版本中,根据 JSR 310。

Instant

暂时使用 UTC,使用 Instant。要以 UTC 格式捕获当前时刻,Instant.now().

Instant 表示自 UTC 中 1970 年第一时刻的纪元参考以来的纳秒计数。

System.currentTimeMillis() 的调用是相同的,自 1970 UTC 开始以来的计数,除了更粗略的毫秒分辨率而不是纳秒。实际上,传统的计算机时钟无法以纳秒为单位准确跟踪当前时刻,因此使用 Instant 捕获当前时刻可能仅捕获微秒(通常在 Java 9 及更高版本中)或毫秒(在 Java 8).

结果:无需调用 System.currentTimeMillis()。请改用 Instant.now()

ZonedDateTime

DateTime 等价于 ZonedDateTime。这个 class 表示通过特定区域(时区)的人们使用的挂钟时间看到的时刻。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;