我对java时间的时间处理感到困惑。我这么长时间的工作假设,如果一个时间戳被指定为祖鲁时间,java会照顾当地时间的偏移量。与Java时间解析混淆UTC
举例说明。我目前在BST中有UTC +1的偏移量。考虑到这一点,我希望这个祖鲁时间:
2016-09-12T13:15:17.309Z
是
2016-09-12T14:15:17.309
LocalDateTime解析之后。这是因为我的默认系统时间设置为BST,而上述时间戳(祖鲁时间)指定它是UTC时间。
而是然而考虑这个示例:
String ts = "2016-09-12T13:15:17.309Z";
LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
这将打印:
2016-09-12T13:15:17.309
所以时间戳,解析为一个LocalDateTime,不被识别为UTC时间,而不是为本地时间直接进行处理。 所以我想,也许我需要将其解析为ZonedDateTime并专门将其转换为LocalDateTime以获得正确的本地时间。有了这个测试:
String ts = "2016-09-12T13:15:17.309Z";
ZonedDateTime parse = ZonedDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
System.out.println(parse.toLocalDateTime());
我得到的输出:
2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
两个日期相同的输出。
正确解析这是我能找到的唯一方法,就是:
String ts = "2016-09-12T13:15:17.309Z";
Instant instant = Instant.parse(ts); // parses UTC
LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);
System.out.println(ofInstant);
此打印:
2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
这是正确的。
所以问题(S)是:
- 应该不是Java的时间认识一个UTC时间戳,并将其解析到正确的系统默认?
- 如何使用
LocalDateTime#parse
方法获得正确的结果? - 现在我应该使用
Instant
来放弃所有的解析吗?
的问题是,jersey/jackson
的Java模块时使用解析ISO格式和定期LocalDateTime#parse
方法的时间戳。我意识到我的时代没有关闭,因为他们被视为LocalTime
,而事实上他们在祖鲁时间。
你的例子看起来像它会做我的例子3的即时对话。你是对的,我误解了什么LocalDateTime代表。呃.. timezones :)谢谢 – pandaadb
啊,所以ZonedDateTime将时区识别为“Z”,它自动解释为UTC(正是我想要的) - 是吗? – pandaadb
@pandaadb是的,这可能只是写这个的另一种方式。 –