为何Clock.systemDefaultZone().instant()与LocalTime.now()返回时间不同?
为什么
Clock.systemDefaultZone().instant()和LocalTime.now()返回的时间不一样? 嗨,我来帮你把这个问题掰明白~
首先得搞清楚这两个方法到底在返回什么,本质上它们的目标就不一样:
1. Clock.systemDefaultZone().instant():返回的是UTC标准时间
虽然你用了systemDefaultZone()创建Clock,但instant()方法本身的设计就是返回UTC时间(也就是协调世界时,输出里的Z就代表UTC时区)。不管你的本地时区是莫斯科还是别的什么,这个方法给你的都是UTC时间线上的一个瞬间。比如你的输出2018-03-19T10:10:27.156Z,就是UTC的10点10分。
2. LocalTime.now():返回的是你本地时区的时间
LocalTime.now()默认会使用你系统的默认时区(Europe/Moscow),把当前的UTC瞬间转换为本地时间。2018年莫斯科时区是UTC+3,所以UTC的10点10分,对应莫斯科本地时间就是13点10分——这就是你看到两者时间不一样的核心原因!
验证一下:把Instant转成本地时区的LocalTime就一致了
你可以试试这段代码,把Instant转换为莫斯科时区的时间,结果就会和LocalTime.now()完全匹配:
Instant utcInstant = Clock.systemDefaultZone().instant(); // 将UTC瞬间转换为本地时区的时间 LocalTime localTimeFromInstant = utcInstant.atZone(ZoneId.systemDefault()).toLocalTime(); System.out.println(localTimeFromInstant); // 和LocalTime.now()的输出一致
关键总结
Instant是与时区无关的,它只代表UTC时间线上的一个精确点,所以永远是UTC时间。LocalTime.now()是把这个UTC点,根据你本地时区的偏移量,转换为你电脑任务栏显示的本地时间。- 你说的“两者都使用默认时区”其实不准确:
Clock.systemDefaultZone()只是用来获取当前瞬间的一个载体,但instant()本身不关心时区;而LocalTime.now()才是真正用默认时区做了转换。
内容的提问来源于stack exchange,提问作者inqi777
相关产品推荐
相关产品推荐

