给定一个由时间戳(例如'2016-06-07 08-01-55')和特定的ZoneId('Europe/Berlin')组成的即时,此代码的预期结果是什么?
ZonedDateTime.ofInstant(timestamp.toInstant, zoneId)
会不会是
'2016-06-07 08-01-55 +02:00' (时间不变,但 ZoneId 已更改)
或
'2016-06-07 10-01-55 +02:00' (时间和区域 ID 已更改)
我问这个问题是因为我在不同的环境中看到了这两种行为。
输出是确定性的,假设您正确设置了每个参数。使用您的数据:
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]
一个瞬间总是从 1970-01-01T00:00:00Z 开始计算。因此,从某个时刻创建 ZonedDateTime 会将该时刻时间戳转换为相应的区域。
在您的示例中,输入时间戳似乎不包含区域信息。最有可能的是,当它被解析为一个瞬间时,它将产生不同的结果,因为大多数解析器会假设时间戳位于系统默认区域中。根据运行该系统的系统,这可能会导致不同的时刻,这反过来又可能导致您观察到的不同行为。