【发布时间】:2019-12-07 11:58:06
【问题描述】:
我正在使用下面的代码来解析日期字符串:
String time = "2 Jun 2019 03:51:17 PM ACST";
String pattern = "d MMM yyyy hh:mm:ss a z"; // z detects the time zone (ACST here)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
// ZonedDateTime localDateTime = LocalDateTime.from(formatter.parse(time)).atZone(ZoneId.of("Australia/Adelaide"));
// localDateTime.toInstant().toEpochMilli();
当我通过调试检查formatter.parse(time)时,它已经具有纪元时间和时区:
// formatter.parse(time) :
{InstantSeconds=1559456477},ISO,Australia/Adelaide resolved to 2019-06-02T15:51:17
我的问题是如何从Parsed 类型的formatter.parse(time) 中提取时区(此处为澳大利亚/阿德莱德),以便在此行的atZone() 中动态使用时区? :
ZonedDateTime localDateTime = LocalDateTime.from(formatter.parse(time)).
atZone(ZoneId.of("Australia/Adelaide"));
即使是 Furthur,如何从 formatter.parse(time) 响应中提取 InstantSeconds=1559456477 以避免采取以下更多步骤来获取纪元时间戳? :
ZonedDateTime localDateTime = LocalDateTime.from(formatter.parse(time)).
atZone(ZoneId.of("Australia/Adelaide"));
localDateTime.toInstant().toEpochMilli();
【问题讨论】:
-
你是不是过于复杂了?
ZonedDateTime.parse(time, formatter)为您提供具有正确区域的ZonedDateTime(除非缩写词不明确,但它们通常是)。或者ZonedDateTime.from(formatter.parse(time))如果出于某种原因您更喜欢。类似地,only 获取您可以使用的区域ZoneId.from(formatter.oarse(time))。 -
@OleV.V.是的,你是对的。我不知道
ZonedDateTime.parse(time, formatter)也没有类似于LocalDateTime.parse()或ZoneId.from()。因此,要在一行中实现纪元时间,这可以正常工作:ZonedDateTime.parse(time, formatter).toInstant().toEpochMilli();;除了我们需要zoneID的地方,ZoneId.from(formatter.oarse(time))会派上用场。