我在看 Clock来自java的类,以便我可以将其作为依赖项注入(inject)以获得更好的可测试性。但是我不明白这两种方法的区别systemUTC
和 systemDefaultZone
. Instant.now()
似乎在内部使用 systemUTC
时钟而 YearMonth.now()
使用 systemDefaultZone
钟。我已经阅读了 javadoc,但对我来说不是很清楚。
我有使用 Instant.now()
的代码和 YearMonth.now()
并想通过一些示例来了解两个时钟之间的区别,其中错误地使用每个时钟可能会导致问题。
最佳答案
就instant
而言Clock.systemUTC
返回的两个时钟的方法和 Clock.systemDefaultZone
,他们会做同样的事情。他们的两个文档都说时钟“基于最佳可用系统时钟”。所以创建 Instant
s 使用时钟将始终为您提供相同的瞬间。
当您尝试创建日期或时间时,行为会有所不同。 systemUTC
做这个:
Conversion from instant to date or time uses the UTC time-zone.
鉴于
systemDefaultZone
做这个:converting to date and time using the default time-zone.
因此,尽管如果您问他们当前时刻是什么,两者都会返回相同的时刻,但它们不一定会返回相同的
LocalDateTime
, 或 LocalDate
, 或 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个小时!
关于java - Clock.systemUTC() 和 Clock.systemDefaultZone() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63148324/