JodaTime 比较两个不同时区的日期

JodaTime Comparing two dates with different time zone

如果我比较两个不同时区的DateTime,有问题,还是应该让他在同一个时区?

示例:

DateTimeZone a = new DateTimeZone("Pacific/Kiritimati");
    DateTimeZone b = new DateTimeZone("Pacific/Gambier");

    DateTime dateOne = new DateTime(a);
    DateTime dateTwo = new DateTime(b);

    if (dateOne.compareTO(dateTwo) == 0) {
        // yes
    } else {
        // no
    }

谢谢你。 (抱歉我的英语不好)

人们总是对日期和时区感到困惑。日期(或时间,或日期时间)是特定的瞬间。这个瞬间在全宇宙都是一样的,所以它与时区无关,通常用UTC(世界时)或Z(祖鲁时间)来表示。 Timzone 是对 UTC 的修改,以显示地球上该特定区域的相对太阳时。通过设置时区,您只是在告诉这个日期时间是相对于这个特定时区的,但在内部它仍将表示为 UTC。在这种情况下,如果时区具有不同的 UTC 偏移量,它们应该不同。

使用java.time

Joda-Time project is now in maintenance mode, with the team advising migration to the java.time classes.

您确实可以比较不同时区的日期时间对象。在内部,时刻被计算为自 1970-01-01T00:00:00Z 纪元以来的秒数(加上小数秒)。虽然每个指定时区的挂钟时间都不同,但可以将它们的潜在含义视为 UTC 时间轴上的一个点。因此,可以轻松比较任何一对日期时间对象。

在 java.time 中,我们使用 ZonedDateTime 来完成这项工作。此 class 提供 isEqualisBeforeisAfter 比较方法。

ZoneId zP_K = ZoneId.of( "Pacific/Kiritimati" ) ;
ZoneId zP_G = ZoneId.of( "Pacific/Gambier" ) ;

Instant instant = Instant.now() ;  // Current moment in UTC, with resolution up to nanoseconds.

ZonedDateTime zdtP_K = instant.atZone( zP_K ) ;
ZonedDateTime zdtP_G = instant.atZone( zP_G ) ;

Boolean sameMoment = zdtP_K.isEqual( zdtP_G ) ; // Or `isBefore` or `isAfter`.

看到这个 code run live at IdeOne.com

instant.toString(): 2017-06-15T12:53:35.276Z

zdtP_K.toString(): 2017-06-16T02:53:35.276+14:00[Pacific/Kiritimati]

zdtP_G.toString(): 2017-06-15T03:53:35.276-09:00[Pacific/Gambier]

sameMoment: true

提示:您的大部分思考、业务逻辑、日志记录和数据 exchange/storage 都在 UTC 中。将 UTC 视为 The One True Time™,其他时区只是变体。仅在业务逻辑需要或向用户展示时应用时区。戴上 Programmer At Work 帽子时忘记您自己狭隘的时区。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.