编辑:好的。不幸的是,我不得不承认我对 Java 时间的理解存在严重缺陷,使得这个问题变得毫无意义。我一直认为 System.currentTimeMillis() 返回的是当地时间。为什么?因为当您使用它创建日期时,它只包含该日期,并且没有对时区的引用,但在传递给 System.out.println() 时仍会打印出本地时间。我从来没有想过是 toString()将(UTC)时间转换为当地时区。:(
我想用 Java 创建一个客户端-服务器应用程序。时间起着重要的作用。因此,我决定暂时将 GMT/UTC 标准化。我还从经验中知道,许多用户的 PC 的时间和/或时区完全错误。最后,我想有比毫秒更精确的时间。
所以我创建了一个类,它在开始时连接到 Internet,并计算到 UTC 的偏移量,与本地时间和时区无关。换句话说,我有一个静态 Java 方法,它以纳秒为单位返回 UTC 时间,并且可以在任何 PC 上独立于本地时间设置工作。
现在,我的问题是我想使用 JSR 310 来操纵时间(实际上是 Java 7 反向端口),我看不到如何定义一个不基于本地时间的时钟。
在我看来,Clock.millis() 和 Clock.instant() 方法必须使用本地时间才能正常工作[编辑:因为这些方法盲目地返回 System.currentTimeMillis(),与设置的时区属性无关]。所以我基本上必须将我的 UTC 时间转换为本地时间,以创建一个 Instant,这样我就可以创建一个 UTC ZonedDateTime,它将本地时间再次转换回 UTC。这简直是疯了。如果我在 Clock.millis() 和 Clock.instant() 中使用 UTC 时间,然后创建一个 UTC ZonedDateTime ,我不想与之有任何关系的本地时间偏移会被应用两次。
从 UTC 转换到本地然后再转换回来是很昂贵的,所以我真的很希望能够使用纯粹的 UTC。我正在开发一个实时游戏,而不是一个网络应用程序,这样小的延迟将毫无意义。
我可以只返回 UTC 时间,并“假装”时区是“本地”以获得正确的数字,但是事情可能会在 DST 边界处中断,并且会使将时间转换为其他时区变得更加复杂。