Gson:java.text.ParseException:Unparseable date:“2018-04-09T09:00:00 + 02:00” [英] Gson: java.text.ParseException: Unparseable date: "2018-04-09T09:00:00+02:00"

查看:939
本文介绍了Gson:java.text.ParseException:Unparseable date:“2018-04-09T09:00:00 + 02:00”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

Gson使用:

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

但它给出以下例外:

  com.google.gson .JsonSyntaxException:2018-04-09T09:00:00 + 02:00 
在com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:107)
的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(ReflectiveTypeAdapterFact ory.java:183)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.read(ReflectiveTypeAdapterFactory.java:95)
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ Adapter .read(ReflectiveTypeAdapterFactory.java:183)
在com.google.gson.Gson.fromJson(Gson.java:805)
在com.google.gson.Gson.fromJson(Gson.java:743 )
... 35 more
导致:java.text.ParseException:Unparseable日期:2018-04-09T09:00:00 + 02:00$ java.util.b $ b。 DateFormat.parse(DateFormat.java:337)
at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:105)
... 52 more

$ b


解决方案

您将 Z 置于引号内('Z')。如果您查看javadoc ,你会看到:

lockquote

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

这意味着您的格式化程序需要字母 Z (而不是其他值,如 +02:00 ),这就是为什么你会收到错误。



在同一个javadoc页面中,我们可以看到模式字母解析偏移量( +02:00 部分)是 X ,所以你的格式化程序应该是这样的:

  new SimpleDateFormat(yyyy-MM-dd'T'HH:mm:ssXXX,Locale 。我们); 

正如注释中注意到的那样, X 仅在java 7中引入。在旧版本中,唯一的方法是拆分字符串并将格式化程序中的偏移量设置为 TimeZone

String input =2018-04-09T09:00:00 + 02:00;
Pattern pattern = Pattern.compile((。*)([\\ + | \\-] \\ {2}:\\d {2})) ;
Matcher matcher = pattern.matcher(input);
if(matcher.find()){
SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd'T'HH:mm:ss,Locale.US);
//时区将是GMT + 02:00
sdf.setTimeZone(TimeZone.getTimeZone(GMT+ matcher.group(2)));
//没有偏移部分的解析日期
日期日期= sdf.parse(matcher.group(1));
}






正如评论,你也可以使用三通backport: http://www.threeten.org/threetenbp/

这是java 8的日期/时间类的后端,它使用起来更好,更容易:

  OffsetDateTime odt = OffsetDateTime.parse(2018-04-09T09:00:00 + 02:00); 

如果您仍然需要使用 java.util.Date 很容易完成转换:
$ b

  Date date = DateTimeUtils.toDate( odt.toInstant()); 


How can I parse a string date in the format:

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

Gson uses:

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

But it gives the following exception:

    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

Thanks in advance.

解决方案

You put the Z inside quotes ('Z'). If you take a look at the javadoc, you'll see that:

Text can be quoted using single quotes (') to avoid interpretation

This means that your formatter is expecting the letter Z (and not some other value like +02:00), and that's why you're getting the error.

In the same javadoc page we can see that the pattern letter to parse offsets (the +02:00 part) is X, so your formatter should be like this:

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

As noticed in the comments, the pattern X was introduced only in java 7. In older versions, the only way is to split the string and set the offset in the formatter as a 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));
}


As said in the comments, you can also use the threeten backport: http://www.threeten.org/threetenbp/

That's a backport to java 8's date/time classes, and it's much better and easier to use:

OffsetDateTime odt = OffsetDateTime.parse("2018-04-09T09:00:00+02:00");

And if you still need to use java.util.Date, is easy to do the conversion:

Date date = DateTimeUtils.toDate(odt.toInstant());

这篇关于Gson:java.text.ParseException:Unparseable date:“2018-04-09T09:00:00 + 02:00”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆