【问题标题】:Are methods DateTime.now() and new DateTime(System.currentTimeMillis()) equal in java?java中的方法 DateTime.now() 和 new DateTime(System.currentTimeMillis()) 是否相等?
【发布时间】:2019-08-23 06:35:25
【问题描述】:

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

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

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

【问题讨论】:

  • 不要将 joda 库与 jdk8 一起使用。 jdk8 中的 java.time 包和 joda 非常相似,所以两者都没有意义。
  • @DawoodibnKareem 如何在 java 8 中写同样的东西?
  • joda 的 DateTime 类的 java.time 等效项称为 ZonedDateTime。你想写ZonedDateTime.now()。但我认为您应该阅读LocalDateTimeInstantZonedDateTimeOffsetDateTime 之间的区别,因为所有四个类之间都有相似之处,您需要根据您的特定需求选择正确的一个。
  • 您还可以将时钟传递给 now 方法的重载。测试可以提供时钟的存根实现,因此您的测试可以指定时间。

标签: java date datetime jodatime java-time


【解决方案1】:

tl;博士

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

在内部,由于 1970-01-01T00:00:00Z 的纪元参考(Z 表示 UTC),时刻以整秒计数加上小数秒作为纳秒计数进行跟踪。

java.time

您的 DateTime 课程显然来自 Joda-Time 库。该库的创建者 Stephen Colebourne 继续按照 JSR 310 将 Joda-Time 替换为 Java 8 及更高版本中内置的 java.time 类。

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。此类表示通过特定地区(时区)的人们使用的挂钟时间看到的时刻。

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

【讨论】:

  • Instant 不代表“UTC 时刻”。它代表一个时间点,完全不受时区影响。
  • @Holger 你的观点对我来说似乎很迂腐,对试图学习日期时间处理的棘手主题的人来说根本没有用。在我看来,从 1970 年 UTC 的第一刻起的纳秒计数是在 UTC 中跟踪时间,是 UTC 中的一个时刻。这不是在 UTC 中是怎么回事?你的观点提供了哪些让我无法理解的实用程序?
  • 特别是当尝试学习一个棘手的主题时,重要的是不要用不恰当的东西污染一个概念。 Instant 代表一个时刻,无论我身在何处。当我不想处理时区时,Instant 是首选。用“UTC”标记与时区无关的东西会让人分心,这时区。 在内部,它存储为来自1970-01-01T00:00:00Z 的计数,因此参考值 是UTC 时区中的日期。温度的参考值有压力,温度还是没有压力。
【解决方案2】:

在 Java 8 中,DateTime maps to java.time.ZonedDateTimejava.time.OffsetDateTime

此页面由 Joda Time 的创建者/作者/维护者编写,并推荐:

如果您使用 Java SE 8 编写代码,那么是时候迁移到 java.time...

【讨论】:

  • 你能告诉我如何使用 java 8,同样的事情吗? 'DateTime.now()' 或 .'new DateTime(System.currentTimeMillis())' ?
  • 'LocalDateTime localDateTime = LocalDateTime.now();这是正确的吗?
  • @uma 不,LocalDateTime 的使用不正确。该类不能用于跟踪时刻,因为它缺少任何时区概念或与 UTC 的偏移量。该课程与此页面上的讨论无关。我无法想象打电话给LocalDateTime.now()会有用的情况。
【解决方案3】:

是的。 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());
}

与第一种方式相同。

【讨论】:

    【解决方案4】:

    是的。

    这是相关代码:

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

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多