当前位置: 首页 > 知识库问答 >
问题:

ThreeTenBP:解析带有时区名称的日期时出现Parse异常

笪健
2023-03-14

我正在尝试解析EEE,dd MMM yyyy HH:MM:SS zzz格式的日期,例如使用Threeten的DateTimeFormatter解析“Tue,16 May 2017 07:44:48 GMT”之类的字符串。但是,由于某种原因,似乎无法解析时区名称(我尝试在没有时区名称部分的情况下解析同一个字符串,结果成功了)。

下面是代码的解析部分:

DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);

我为时区名称部分尝试了各种不同的格式(例如z,zzz,z,zzz),但都不起作用。同样,如果我解析一个不包含时区名称部分的子字符串日期(到LocalDateTime中),那么它可以工作,所以我确信问题出在时区名称上。有没有人知道问题出在哪里?

共有1个答案

南门祯
2023-03-14

我不知道为什么你的代码不起作用。当我在Java8中使用Java.time类时,就会出现这种情况。所以这只是一个可能的解决方法的猜测:

    DateTimeFormatter parseFormatter = DateTimeFormatter.RFC_1123_DATE_TIME;
    ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);

你会注意到这是一个轻微的简化在同一时间。

datetimeformatter.rfc_1123_date_time记录为

返回RFC-1123日期-时间格式化程序,如“Tue,3 Jun 2008 11:05:30 GMT”。

因此我认为它应该接受GMT作为时区名称。我应该说它符合你的日期字符串,而且它也适用于我的电脑。我相信这个格式化程序使用英文缩写来表示星期和月,而不考虑地区(或者您可以尝试datetimeformatter.rfc_1123_date_time.withlocale(locale.English),但我真的不认为这是必要的)。

也就是说,他们说你应该避免使用三个和四个字母的时区缩写。有的模棱两可,有的不是全时区,这就导致了进一步的模棱两可。虽然GMT不是最危险的一种,但如果您能够获得带有偏移量的日期字符串,例如+00:00或仅z,而不是三个字母的区域名称,那么您的问题将得到一个坚如磐石的解决方案

请参阅以下两个示例:问题和答案,在ideone.com上运行live。都成功了。

 类似资料:
  • 问题内容: 我正在尝试像在Python中一样解析时间戳字符串,但是在寻找一种可以处理缩写时区的解决方案时遇到了麻烦。 我正在使用的功能,但无法解析时区。是否有捷径可寻? 问题答案: 这可能不起作用,因为这些缩写不是唯一的。有关详情,请参见此页面。如果使用一组已知的输入,则可能只需要自己手动处理即可。

  • 我想在JavaScript中解析没有时区的日期。我试过:

  • 问题内容: 我想在JavaScript中解析没有时区的日期。我努力了: 返回时间:2005年7月8日星期五, 格林尼治标准时间 +0200 (欧洲中部夏令时间) 返回相同的结果 返回相同的结果 我想解析时间: 没有时区。 无需调用构造函数Date.UTC或新的Date(年,月,日)。 只需将字符串简单地传递到Date构造函数即可(无需原型方法)。 我必须提供对象,而不是。 问题答案: 日期已正确解

  • 我想从格式为“2021-12-10T18:49:00-05:00”的字符串中解析带有时区的日期。我尝试使用“date('Y-m-dh:I:s',strotime($myDate))”进行解析。但这是第二天的返回日期。非常感谢您的帮助。

  • 我正在尝试在中解析这些日期,然后获取表示形式。 我阅读了这个类似的答案,并创建了一个方法来解析上述日期并返回具有所需格式的: 然而,没有一个图案是匹配的。我这里缺少什么? 更新:在这两个日期中,我都收到了字符的异常。

  • (我想)快速提问。如何将解析为(将时间设置为)? java.time.format.DateTimeParseException:无法分析文本“2007-07-21+00:00”:无法从TemporalAccessor获取OffsetDateTime:{offsetseconds=0},ISO解析为类型java.time.format.Parsed的2007-07-21