Gson:java.text.ParseException:无法解析的日期:“2018-04-09T09:00:00 + 02:00”

时间:2018-04-09 09:30:06

标签: java timezone gson simpledateformat parseexception

如何以格式解析字符串日期:

"2018-04-09T09:00:00+02:00"

Gson使用:

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US)

但是它给出了以下例外:

    com.google.gson.JsonSyntaxException: 2018-04-09T09:00:00+02:00
    at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:107)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:82)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:35)
    at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183)
    at com.google.gson.Gson.fromJson(Gson.java:805)
    at com.google.gson.Gson.fromJson(Gson.java:743)
    ... 35 more
Caused by: java.text.ParseException: Unparseable date: "2018-04-09T09:00:00+02:00"
    at java.text.DateFormat.parse(DateFormat.java:337)
    at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:105)
    ... 52 more

提前致谢。

1 个答案:

答案 0 :(得分:1)

您将Z放在引号内('Z')。如果您take a look at the javadoc,您会看到:

  

可以使用单引号(')引用文字以避免解释

这意味着您的格式化程序需要字母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));
}

如评论中所述,您还可以使用三个后退: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());