你把Z
内引号 ('Z'
)。如果你看看javadoc https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html,你会看到:
可以使用单引号 (') 引用文本以避免解释
这意味着您的格式化程序正在等待这封信Z
(而不是其他一些值,例如+02:00
),这就是您收到错误的原因。
在同一个 javadoc 页面中,我们可以看到解析偏移量的模式字母(+02:00
部分)是X
,所以你的格式化程序应该是这样的:
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.US);
正如评论中所注意到的,该模式X
仅在java 7中引入。在旧版本中,唯一的方法是分割字符串并将格式化程序中的偏移量设置为TimeZone
:
String input = "2018-04-09T09:00:00+02:00";
Pattern pattern = Pattern.compile("(.*)([\\+|\\-]\\d{2}:\\d{2})");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
// timezone will be GMT+02:00
sdf.setTimeZone(TimeZone.getTimeZone("GMT" + matcher.group(2)));
// parse date without the offset part
Date date = sdf.parse(matcher.group(1));
}
正如评论中所述,您还可以使用 Threeten 反向移植:http://www.triten.org/tritenbp/ http://www.threeten.org/threetenbp/
这是 java 8 的日期/时间类的向后移植,它更好、更容易使用:
OffsetDateTime odt = OffsetDateTime.parse("2018-04-09T09:00:00+02:00");
如果您仍然需要使用java.util.Date
,很容易进行转换:
Date date = DateTimeUtils.toDate(odt.toInstant());