java.Clock中的混淆,systemDefaultZone()返回UTC时间

时间:2017-07-06 16:29:22

标签: java scala utc java-time

我试图理解为什么以下java.time.Clock返回UTC时间而不是本地时区(EST)。

C:\Users\Felipe>scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help.

scala> import java.time._
import java.time._

scala> ZoneId.systemDefault()
res0: java.time.ZoneId = America/New_York

scala> val clock = Clock.systemDefaultZone()
clock: java.time.Clock = SystemClock[America/New_York]

scala> clock.instant
res1: java.time.Instant = 2017-07-06T16:20:04.990Z

我运行上述时间的当前时间是12:20pm(即显示UTC时间前4小时)

2 个答案:

答案 0 :(得分:2)

Instant.toString()方法使用DateTimeFormatter.ISO_INSTANT格式化程序,而后者parses and formats the Instant in UTC

由于2017-07-06T16:20:04.990Z与纽约的2017-07-06T12:20:04.990相同,因此您获得的结果是正确的。

如果您希望将Instant转换为您的时区,则可以执行以下操作:

clock.instant().atZone(ZoneId.systemDefault())

或者您可以更具体(因为系统的默认时区可以更改,即使在运行时也是如此):

clock.instant().atZone(ZoneId.of("America/New_York"))

这将产生ZonedDateTime

  

2017-07-06T12:48:22.890-04:00 [美国/纽约]

如果您愿意,也可以将其转换为LocalDateTime

clock.instant().atZone(ZoneId.of("America/New_York")).toLocalDateTime()

结果将是LocalDateTime

  

2017-07-06T12:49:47.688

PS:@Andreas reminded me in the comments(我忘了提及),Instant类只代表一个时间点(自1970-01-01T00:00Z以来的纳秒数)并且没有时区信息,因此它的任何表示(包括toString()方法)都将采用UTC格式。要获取与Instant对应的本地日期或时间,您必须提供时区,如上所示。

答案 1 :(得分:1)

Instant没有任何时区信息。它只是自纪元以来的秒/纳秒数。 LocalDateTime表示当地时区的时间,可以使用以下时间从时钟获取:

LocalDateTime.now(clock)

您还可以使用以下内容将Instant转换为ZonedDateTime(表示时间以及时区):

clock.instant().atZone(ZoneId.systemDefault())