java.time
我将为您提供现代答案。在处理日期和时间时,请使用java.time,这是现代的Java日期和时间API。
首先,定义一个解析格式:
private static final DateTimeFormatter PARSER = DateTimeFormatter
.ofPattern("EEE MMM dd yyyy HH:mm:ss 'GMT'Z (", Locale.ROOT);
那么就这样解析:
String time = "Sun Jul 15 2012 12:22:00 GMT+0300 (FLE Daylight Time)";
TemporalAccessor parsed = PARSER.parse(time, new ParsePosition(0));
OffsetDateTime dateTime = OffsetDateTime.from(parsed);
System.out.println(dateTime);
输出结果为:
2012年7月15日12:22+03:00
我没有解析你整个字符串,但已经足够确定一个时间点和与GMT(或UTC)的偏移量。Java无法解析时区名称“FLE Daylight Time”,这是Microsoft发明的,Java不认识。因此,我从包含“FLE”之前的圆括号解析该字符串的部分内容以进行验证。为了指示DateTimeFormatter
无需解析整个字符串,我使用带有ParsePosition
作为第二个参数的重载parse
方法。
来自维基百科:
有时由于其在 Microsoft Windows 上的使用,FLE标准时间(适用于芬兰、立陶宛、爱沙尼亚,或者有时适用于芬兰、拉脱维亚、爱沙尼亚)...被用来指代东欧时间。
如果您必须使用Date
对象,通常是为了遗留API,现在不能升级到java.time,请按以下方式进行转换:
Date oldfashionedDate = Date.from(dateTime.toInstant());
System.out.println(oldfashionedDate);
在欧洲/塔林时区运行时的输出:
2012年7月15日星期日12:22:00 EEST
你的代码出了什么问题?
您的SimpleDateFormat
成功地将GMT+03
解析为与格式模式字符串中的小写z
匹配的“时区”。然后,它尝试将剩余的00
解析为与大写Z
匹配的偏移量。由于偏移量需要一个符号,因此失败了。
我做错了什么?
正如其他人所说,您不应尝试将GMT
解析为时区缩写。 GMT
可以用作时区缩写;但是您的时间不在GMT中。所以你不想要那个。这只会让人产生误解。如果你成功了,你可能会冒险得到错误的结果,因为你已经解析了一个对你的目的来说不正确的时区。
链接
"... zz (zzzz)
,你把一个Z
大写了。 - Joachim Sauertime
字符串从哪里来? - Keppil