Java Clock.systemUTC()和Clock.systemDefaultZone()之间有什么区别?
我正在查看java中的类,以便可以将其作为依赖项注入,以获得更好的可测试性。但是我不理解这两种方法Java Clock.systemUTC()和Clock.systemDefaultZone()之间有什么区别?,java,datetime,Java,Datetime,我正在查看java中的类,以便可以将其作为依赖项注入,以获得更好的可测试性。但是我不理解这两种方法systemUTC和systemDefaultZone之间的区别。Instant.now()似乎在内部使用systemUTC时钟,而YearMonth.now()使用systemDefaultZone时钟。我已经读过javadoc,但是我不太清楚 我有使用Instant.now()和YearMonth.now()的代码并想通过一些示例了解两个时钟之间的差异,其中错误地使用每个时钟可能会导致问题。根据
systemUTC
和systemDefaultZone
之间的区别。Instant.now()
似乎在内部使用systemUTC
时钟,而YearMonth.now()
使用systemDefaultZone
时钟。我已经读过javadoc,但是我不太清楚
我有使用
Instant.now()和YearMonth.now()的代码
并想通过一些示例了解两个时钟之间的差异,其中错误地使用每个时钟可能会导致问题。根据Clock.systemUTC
和Clock.systemDefaultZone
返回的两个时钟的即时方法,它们将执行相同的操作。他们的两份文件都说,时钟“基于最佳可用系统时钟”。因此,使用时钟创建Instant
s将始终为您提供相同的瞬间
当你试图创建一个日期或时间时,行为上的差异就会出现<代码>系统UTC
执行以下操作:
从即时到日期或时间的转换使用UTC时区
而systemDefaultZone
则执行以下操作:
使用默认时区转换为日期和时间
因此,尽管如果您询问它们当前的瞬间是什么,它们都将返回相同的瞬间,但它们不一定返回相同的LocalDateTime
,或LocalDate
,或ZonedDateTime
。例如,假设我的系统时区为亚洲/上海
,全年的偏移量为UTC+8。现在是2020-07-29上海的凌晨5点。如果我执行LocalDate.now(Clock.systemUTC())
,它会告诉我2020-07-28
,因为它仍然是UTC时区中的第28个。但是,如果我执行LocalDate.now(Clock.systemDefaultZone())
,它会告诉我2020-07-29
,因为上海是2020-07-29(系统时区)
现在,您应该了解为什么日期/时间相关类的无参数Now
使用systemDefaultZone
。如果我在上海做了LocalTime.now()
,看到时间早了8个小时,那就太奇怪了