我想要获取特定时区中的当前时间与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路车。
发布于 2019-06-14 02:35:56
Duration
是错误的类。在一个时区的"now“和另一个时区的"now”之间没有持续时间。有关这方面的有趣但令人难忘的思考方式,请参阅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-01-01夏威夷的08:00:00
(Pacific/Honolulu
)也是基里巴斯的08:00:00
(Pacific/Kiritimati
),但是2019-01-02 -第二天!(Reference here.)因此,如果你有一个带有08:00:00
的LocalTime
对象,并且它在这两个区域中的一个区域是08:00:00
,你将无法分辨它是哪个区域,或者相应的UTC偏移应该是什么。
此外,请记住,时区偏移量不限于整个小时。现在的时区有半小时和45分钟的时差。从历史上看,还有其他的。
最后,请记住,偏移量不一定足以识别时区。许多时区在某些时间点共享偏移量,但在其他时间点不同。请参阅the timezone tag wiki中的“时区!=偏移”。
哦,关于你的结果,在一个方向上得到2
,在另一个方向上得到-3
-这是由于你的整数除法造成的舍入误差。如果打印出秒值,您会注意到它们相差一秒(10799
,vs -10800
)。仔细研究一下,您会发现"now“包含了被getSeconds
调用截断的小数秒。(您调用了.now()
两次,因此它们的时间略有不同。)
https://stackoverflow.com/questions/56586332
复制相似问题