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"
问题描述
如何解析字符串日期格式:
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
$ b
在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
解决方案您将
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屋!