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

标签 java datetime

我在看 Clock来自java的类,以便我可以将其作为依赖项注入(inject)以获得更好的可测试性。但是我不明白这两种方法的区别systemUTCsystemDefaultZone . 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/

相关文章:

java - 在 Java 中避免超时/饥饿的常见做法?

java - 无法应用插件[class 'org.gradle.api.plugins.scala.ScalaBasePlugin']:Gradle v2.13

java - 没有时区的 Jaxb DateTime

php - 不断从 Carbon Laravel 获取未知或错误的时区

ruby - 从 Ruby 中的 DateTime 中减去 n 小时

java - 递归到非递归,现在困扰我一段时间

java - 在 playframework 中验证卡到期日期

java - 如何使用 Guice 将参数传递给 Provider?

sql - 在非常大的表中选择最近的值

java - 有没有办法可以在Java中打印两个纪元时间之间的所有天数?