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

Can*_*ell 4 java datetime

我正在查看java中的Clock类,以便我可以将它作为依赖项注入以提高可测试性。但我不明白这两种方法systemUTCsystemDefaultZone. 在Instant.now()似乎是内部使用systemUTC的时钟,而YearMonth.now()使用的systemDefaultZone时钟。我已经阅读了 javadoc,但对我来说不是很清楚。

我有使用Instant.now()YearMonth.now()希望通过一些示例了解两个时钟之间的区别的代码,其中错误地使用每个时钟会导致问题。

Swe*_*per 6

在方面instant通过返回的两个时钟的方法Clock.systemUTCClock.systemDefaultZone,他们会做同样的事情。他们的两个文档都说时钟“基于最佳可用系统时钟”。因此,Instant使用时钟创建s 将始终为您提供相同的时刻。

当您尝试创建日期或时间时,行为就会有所不同。systemUTC做这个:

从即时到日期或时间的转换使用 UTC 时区。

systemDefaultZone这样做:

使用默认时区转换为日期和时间。

因此,尽管如果您问他们当前的时刻是什么,两者都会返回相同的时刻,但它们不一定返回相同的LocalDateTime, or LocalDate, or ZonedDateTime。例如,假设我的系统时区是Asia/Shanghai,全年都在 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 小时前,那会很奇怪!