【问题标题】:Getting the current Instant in a specific TimeZone获取特定时区中的当前 Instant
【发布时间】:2016-12-11 00:19:11
【问题描述】:

我尝试在特定时区获取当前实例,但它没有按预期工作。关于如何做到这一点的任何想法?

这就是我所做的:

Instant.now(Clock.system(ZoneId.of("America/Los_Angeles"))).truncatedTo(ChronoUnit.SECONDS)

但是,返回的即时时间始终是 UTC。我多次更改了 ZoneID,但总是错误的。请指教。

编辑:

我正在与一个使用时间戳生成日志的应用程序进行交互,我需要对这些事件进行操作。例如,如果我使用特定的时间戳启动我的程序,它应该从那个时间戳开始读取事件。虽然我的笔记本电脑与生成这些事件的应用程序位于同一时区,但当我得到 Instant.Now() 时,我似乎在 UTC。而应用程序根据我们所在的 TimeZone 生成时间戳。我希望我的程序的时钟与服务器中的时钟相同。

应用程序生成格式为 2016-08-04T18:17:51Z 的时间戳

【问题讨论】:

  • 在特定时区使用Instant 是没有意义的,因为Instant 没有时区的概念,只有自纪元以来的毫秒数。那么你到底想做什么/拥有什么?
  • 在 Java 8 time api 中, Instant 应该代表时间线上的单个瞬时点。现在,当您尝试将该时间点转换为人类的日期和时间概念时,时区的概念就开始发挥作用了。
  • 嗯,我正在与一个应用程序交互,该应用程序返回一些带有时间戳的事件,我需要根据它们的时间戳对这些事件进行操作。
  • Instant.now(clock) 的目的是什么?
  • @MaatDeamon, Clock 提供两件事 - 时区和当前时刻。对于Instant,仅使用当前时刻。 (Clock的两部分本来可以是两个不同的接口,但我们判断分离没有增加足够的价值)

标签: java scala java-8 java-time


【解决方案1】:

Instant 不支持时区。如果您需要时区感知时间戳,您应该使用ZonedDateTime

查看ZonedDateTime.now(timezone),它将使用提供的时区。要使用机器的默认时区,请使用ZonedDateTime.now()

如果要解析 ZonedDateTime 并覆盖时区,可以根据需要使用 ZonedDateTime.withZoneSameLocalZonedDateTime.withZoneSameInstant

【讨论】:

  • 谢谢。我对系统的时间戳感到困惑,它们实际上是 UTC。我犯了一个错误,但感谢您的意见,这有助于澄清一切
猜你喜欢
  • 2012-03-23
  • 2016-09-27
  • 2019-06-14
  • 2017-09-18
  • 2015-01-03
  • 2019-10-01
  • 2017-04-30
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多