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

时间:2015-06-10 10:00:22

标签: java datetime time jodatime

如果我将两个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
    }

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

使用java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time类。

您确实可以比较不同时区的日期时间对象。在内部,该时刻被计算为自1970-01-01T00:00:00Z时期以来的秒数(加上小数秒)。虽然挂钟时间按指定的时区显示不同,但请考虑它们的基本含义是UTC时间轴上的一个点。因此,可以轻松地比较任何一对日期时间对象。

在java.time中,我们使用ZonedDateTime来完成这项工作。该课程提供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

提示:您的大部分想法,业务逻辑,日志记录以及数据交换/存储均采用UTC格式。将UTC视为 The One True Time™,其他区域仅仅是变化。仅在业务逻辑需要的地方应用时区或向用户显示时区。在戴着 Programmer At Work 帽子的时候忘记你自己的狭隘时区。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore