从Instant和ZoneId形成ZonedDateTime时的预期行为是什么?

时间:2016-06-07 09:50:40

标签: java timezone java-time

鉴于TimeStamp形成的瞬间(例如' 2016-06-07 08-01-55')和特定的ZoneId('欧洲/柏林'),什么将是此代码的预期结果?

ZonedDateTime.ofInstant(timestamp.toInstant, zoneId)

是不是

  

' 2016-06-07 08-01-55 +02:00' (时间不会改变,但ZoneId会改变)

  

' 2016-06-07 10-01-55 +02:00' (time& ZoneId已更改)

我问这个问题是因为我看到这两种行为都存在于不同的环境中。

2 个答案:

答案 0 :(得分:2)

瞬间始终从1970-01-01T00:00:00Z开始计算。因此,从瞬间创建ZonedDateTime会将即时时间戳转换为相应的区域。

在您的示例中,输入时间戳似乎不包含区域信息。最有可能的是,当它被解析为瞬间时,它会产生不同的结果,因为大多数解析器都会假设时间戳在系统默认区域中。这可能导致基于运行的系统的不同时刻,这反过来可能导致您观察到的不同行为。

答案 1 :(得分:2)

假设您正确设置了每个参数,输出是确定的。使用您的数据:

LocalDateTime datetime = LocalDateTime.of(2016, 6, 7, 8, 1, 55);
ZonedDateTime zdt = datetime.atZone(ZoneId.of("Europe/Berlin"));
Instant instant = zdt.toInstant();

Timestamp ts = Timestamp.from(instant); //The timestamp you describe in your question

ZonedDateTime result = ZonedDateTime.ofInstant(ts.toInstant(), ZoneId.of("Europe/Berlin"));

System.out.println(result); //WILL ALWAYS PRINTS: 2016-06-07T08:01:55+02:00[Europe/Berlin]