我正在尝试解析 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);
我收到以下错误:
org.triten.bp.format.DateTimeParseException:文本“星期二,2017 年 5 月 16 日”
13:02:16 GMT' 无法在索引 26 处解析
我尝试了时区名称部分的各种不同格式(例如 z、zzz、Z、ZZZ),但没有任何效果。同样,如果我解析没有时区名称部分的子字符串日期(解析为 LocalDateTime),那么它会起作用,所以我确信问题出在时区名称上。有谁知道问题可能是什么?
我不知道为什么你的代码不起作用。当我使用时它会发生java.time
我的 Java 8 中的类。所以这只是对可能的修复的猜测:
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 上实时运行。两者都成功了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)