我正在尝试以EEE,dd MMM yyyy HH:mm:ss zzz的格式解析日期,所以例如使用threeten的DateTimeFormatter“Tue,2017年5月16日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.threeten.bp.format.DateTimeParseException:Text'Tue,2017年5月16日 格林威治标准时间13:02:16无法在指数26处解析
我为时区名称部分尝试了各种不同的格式(例如z,zzz,Z,ZZZ),但没有任何效果。同样,如果我解析一个没有时区名称部分的子日期(进入LocalDateTime),那么它可以工作,所以我确信问题是以某种方式与时区名称。有谁知道问题可能是什么?
答案 0 :(得分:3)
我不知道为什么你的代码不起作用。我在Java 8中使用java.time
类时会这样做。所以这只是对可能修复的猜测:
DateTimeFormatter parseFormatter = DateTimeFormatter.RFC_1123_DATE_TIME;
ZonedDateTime parsedDate = ZonedDateTime.parse(date, parseFormatter);
您会注意到它在同一时刻略有简化。
DateTimeFormatter.RFC_1123_DATE_TIME
记录为
返回RFC-1123日期时格式化程序,例如'2008年6月3日星期二 11:05:30 GMT'。
所以我认为它应该接受GMT
作为时区名称。我应该说它适合你的日期字符串,它也适用于我的电脑。我相信这个格式化程序使用英文缩写来表示星期几和月份,无论语言环境如何(或者您可以尝试DateTimeFormatter.RFC_1123_DATE_TIME.withLocale(Locale.ENGLISH)
,但我真的不认为这是必要的。)
那就是说,他们说你应该避免使用三个和四个字母的时区缩写。有些是模棱两可的,有些不是全时区,这导致更加模糊。虽然GMT不是最危险的,但如果你能得到带有偏移量的日期字符串,例如+00:00
或Z
,而不是三个字母区域,那么解决问题的方法就是坚如磐石的解决方案。名。
请参阅问题和本答案running live at IdeOne.com中的两个示例。两者都成功了。
答案 1 :(得分:1)
在macOS(非Android)上使用 ThreeTen-Backport 1.3.4项目库时:
DateTimeParseException
(解析成功)2017-05-16T13:02:16Z[Africa/Monrovia]
而不是2017-05-16T13:02:16Z[GMT]
Africa/Monrovia
区域?我们中的一些人已经看到你的代码工作,显然使用了Java 8中内置的java.time类。
但是你的问题是关于Java 6&的那些类的后端。 Java 7.所以我使用ThreeTen-Backport项目库尝试了以下示例。
package com.example.threetenbp.example;
import org.threeten.bp.*;
import org.threeten.bp.format.*;
import java.util.Locale;
/**
* By Basil Bourque.
*/
public class App {
public static void main ( String[] args ) {
App app = new App ( );
app.doIt ( );
}
private void doIt ( ) {
String input = "Tue, 16 May 2017 13:02:16 GMT";
DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern ( "EEE, dd MMM yyyy HH:mm:ss z" , Locale.ENGLISH );
ZonedDateTime parsedDate = ZonedDateTime.parse ( input , parseFormatter );
System.out.println ("parsedDate.toString(): " + parsedDate );
}
}
我在构建时获得了一个好奇的结果。在macOS Sierra 10.12.4上使用IntellJ 2017.1.x运行Java 8。我没有在最后获得预期的Z
或Z[GMT]
,而是在利比里亚获得了时区Africa/Monrovia
。这是有效的,因为从UTC的偏移确实为零(与UTC / GMT相同)。但这不是我们看到的{8}看到的{8}类,我们得到2017-05-16T13:02:16Z[GMT]
。
parsedDate.toString():2017-05-16T13:02:16Z [非洲/蒙罗维亚]
我没有Java 6或Java 7的实现。但我确实尝试在IntelliJ中设置我的构建字节码设置以使用Java 6.相同的结果。