1 回答
TA贡献1841条经验 获得超3个赞
在您的字符串中,我认为UTC+01是与 UTC 相差 +1 小时。因此,虽然 UTC 可能已被解释为时区(实际上不是),但这与此处无关,因为字符串中的时间不是 UTC,而是 UTC+01:00。所以我们不应该使用z, time-zone name, 来解析它。这样做基本上是给你错误结果的原因(结合解析成 a ZonedDateTime)。
@VGR 在他/她的评论中是正确的:我们想要'UTC'x. 我仅使用两个示例,足以证明它们给出了不同的结果。
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yy HH:mm:ss 'UTC'x");
String str = "22/04/17 09:24:28 UTC+01";
System.out.println(MessageFormat.format("Parsed String \"{0}\", got result of \"{1}\"",
str, OffsetDateTime.parse(str, formatter)));
str = "22/04/17 09:24:28 UTC+07";
System.out.println(MessageFormat.format("Parsed String \"{0}\", got result of \"{1}\"",
str, OffsetDateTime.parse(str, formatter)));
输出是:
Parsed String "22/04/17 09:24:28 UTC+01", got result of "2017-04-22T09:24:28+01:00"
Parsed String "22/04/17 09:24:28 UTC+07", got result of "2017-04-22T09:24:28+07:00"
周围的单引号UTC表示文字文本,因此格式化程序会检查文本是否存在但对它没有任何意义。一个x是仅由小时组成的偏移量(除非非零分钟是偏移量的一部分),例如+01or +12。由于您的字符串包含偏移量并且没有时区(例如英国时间的欧洲/伦敦),因此OffsetDateTime是表示日期和时间的(最)正确类型。
退一步说,虽然您的格式是人类可读的,但它是非标准的,不适合机器解析。您可能要考虑是否可以说服字符串的发送者改为给您 ISO 8601 格式,例如2017-04-22T09:24:28+01:00.
添加回答
举报