Java Clock.systemUTC()和Clock.systemDefaultZone()之间有什么区别?

Java Clock.systemUTC()和Clock.systemDefaultZone()之间有什么区别?,java,datetime,Java,Datetime,我正在查看java中的类,以便可以将其作为依赖项注入,以获得更好的可测试性。但是我不理解这两种方法systemUTC和systemDefaultZone之间的区别。Instant.now()似乎在内部使用systemUTC时钟,而YearMonth.now()使用systemDefaultZone时钟。我已经读过javadoc,但是我不太清楚 我有使用Instant.now()和YearMonth.now()的代码并想通过一些示例了解两个时钟之间的差异,其中错误地使用每个时钟可能会导致问题。根据

我正在查看java中的类,以便可以将其作为依赖项注入,以获得更好的可测试性。但是我不理解这两种方法
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个小时,那就太奇怪了