如果我比较两个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
}
Thnak你。(抱歉我的英语不好)
人们总是混淆日期和时区。日期(或时间,或datetime)是时间中的特定瞬间。这个时刻在整个宇宙中都是相同的,所以它与时区无关,通常用UTC(世界时)或Z(祖鲁时间)表示。时区是对UTC的修改,以显示地球上这个特定区域的相对太阳时间。通过设置时区,你只是告诉这个datetime相对于这个特定的时区,但在内部它仍然会被表示为UTC。在这种情况下,如果时区有不同的UTC偏移量,它们应该是不同的。
Using java.time
Joda-Time项目现在处于维护模式,团队建议迁移到java。时间类。
您确实可以比较不同时区的日期时间对象。在内部,力矩被计算为自1970-01-01T00:00:00Z
纪元以来的秒数(加上分数秒)。虽然每个指定的时区显示的挂钟时间不同,但它们的潜在含义是UTC时间线上的一个点。因此,任何一对日期时间对象都可以很容易地进行比较。
java。现在我们用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`.
查看此代码运行在IdeOne.com。
instant.toString (): 2017 - 06 - 15 t12:53:35.276z
zdtP_K.toString (): 2017 - 06 - 16 - t02:53:35.276 + 14:00(太平洋/Kiritimati)
zdtP_G.toString (): 2017 - 06 - 15 - t03:53:35.276上午9点(太平洋/甘比尔)
sameMoment:真
提示:你的大部分思维,你的业务逻辑,你的日志,你的数据交换/存储都在UTC。将UTC视为唯一的真实时间™,其他时区只是变化。仅在业务逻辑需要或为向用户表示而需要时应用时区。当你戴着程序员在工作的帽子时,忘记你自己的狭隘时区。
关于java.time
java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date
, Calendar
, &SimpleDateFormat
.
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。
从哪里获取java。时间类?
- Java SE 8, Java SE 9,以及更高版本
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- ThreeTenABP项目专门为Android适配ThreeTen-Backport(上文提到)。
Interval
、YearWeek
、YearQuarter
等。