如果我将两个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
}
骗过你。 (抱歉我的英语不好)
答案 0 :(得分:4)
人们总是对日期和时区感到困惑。日期(或时间或日期时间)是特定时刻。此瞬间在所有Universe中都是相同的,因此它与时区无关,通常表示为UTC(通用时间)或Z(祖鲁时间)。 Timzone是对UTC的修改,以显示地球上这个特定区域的相对太阳时间。通过设置时区,您只是告诉该日期时间与此特定时区相关,但在内部它仍将表示为UTC。在这种情况下,如果时区具有不同的UTC偏移量,它们应该是不同的。
答案 1 :(得分:1)
Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time类。
您确实可以比较不同时区的日期时间对象。在内部,该时刻被计算为自1970-01-01T00:00:00Z
时期以来的秒数(加上小数秒)。虽然挂钟时间按指定的时区显示不同,但请考虑它们的基本含义是UTC时间轴上的一个点。因此,可以轻松地比较任何一对日期时间对象。
在java.time中,我们使用ZonedDateTime
来完成这项工作。该课程提供isEqual
,isBefore
和isAfter
方法进行比较。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。