我想获得特定时区中当前时间与UTC时间之间的小时数差异。我尝试过:
LocalTime time = LocalTime.now();
System.out.println(time); //21:05:42:764
LocalTime utcTime = LocalTime.now(ZoneId.of("UTC"));
System.out.println(utcTime); //18:05:42:769
System.out.println(Duration.between(utcTime, time).getSeconds()/3600); //2
System.out.println(Duration.between(time, utcTime).getSeconds()/3600); //-3
为什么最后两个结果之间有区别,有更好的方法吗?我需要得到数字3。
答案 0 :(得分:4)
Duration
是错误的类。在一个时区中的“现在”与另一个时区中的“现在”之间的持续时间为零。有关思考问题的有趣但有趣的方法,请参见here。
您似乎正在寻求了解给定时区与UTC的当前偏移量。您可以为此使用ZonedDateTime
类:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
ZoneOffset offset = zdt.getOffset();
int offsetMinutes = offset.getTotalSeconds() / 60;
double offsetHours = ((double) offsetMinutes) / 60;
System.out.println(offsetHours); // 5.5
如果要使用计算机的当前时区,也可以仅在第一行使用ZonedDateTime.now()
。
关于LocalTime
-只是时间部分(小时,分钟,秒和更短的时间)。由于没有关联的日期,因此您不必确定它属于哪个时区偏移量。在任何给定的时刻,“今天”都会发生多个日期。时区偏移量的范围从UTC-12到UTC + 14,因此确实存在一些值,它们表示一天中的同一时间发生在地球上某处的两个不同日期。
例如,2019年1月1日在夏威夷(08:00:00
)的Pacific/Honolulu
也在基里巴斯(08:00:00
)中的Pacific/Kiritimati
,但在2019-01- 02-下一个日期! (Reference here.)因此,如果您有一个带有LocalTime
的{{1}}对象,并且在两个区域之一中它是08:00:00
,则您将无法分辨出哪个是,还是对应的UTC偏移量应该是什么。
此外,请记住,时区偏移量不仅限于整个小时。有些时区具有半小时和45分钟的偏移时间。从历史上看,还有其他人。
最后,请记住,偏移量不一定足以标识时区。许多时区在某些时间点共享偏移量,但在其他时间点上有所不同。请参见the timezone tag wiki中的“时区!=偏移”。
哦,关于您的结果在一个方向上获得08:00:00
而在另一个方向上获得2
的情况-这是由于整数除法而导致的舍入误差。如果打印秒值,您会发现它们相距一秒(-3
与10799
)。仔细研究一下,您会发现“现在”包括被-10800
调用截断的小数秒。 (您两次致电getSeconds
,所以他们的时间略有不同。)
答案 1 :(得分:4)
为什么最后两个结果之间有区别
在两个计算的持续时间内获得不同结果的原因是以下两个事实的结合:两个记录之间的时间间隔很小,以及持续时间 start 时间包含在范围内,但持续时间 end 时间未包含在内。
请考虑以下时间:6:00:00:001
与8:00:00:000
。在这里,很明显我们只不过是两个小时的一毫秒,但是当我们想到几秒钟时,我们要么得到7199
要么得到-7200
。然后,当我们做整数数学(即除以3600
)时,我们将得到1
或-2
。
如果不是在第一个时间戳上花了一个毫秒,那么两者的绝对值将是相同的。