GsonBuilder setDateFormat for“2011-10-26T20:29:59-07:00”

我在json的date/时间为2011-10-26T20:29:59-07:00 。 什么是正确的方式来使用gsonBuilder.setDateFormat正确格式化这个时间?

-07:00是ISO 8601时区表示法。 在Java 7之前, SimpleDateFormat不支持这个function。 所以,如果你可以升级到Java 7,那么你可以用X来表示那个时区的表示法:

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create(); 

在Java 6上,您需要先进行一些模式匹配,然后replaceJSONstring,用RFC 822符号-0700replace-07:00部分,以便使用Z

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 

或通过GMT-07:00的一般时区标记,以便您可以使用z

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create(); 

对于Java 8(尚未针对Java 7进行validation),只需使用该模式即可

 yyyy-MM-dd'T'HH:mm:ssXXX 

要得到2011-10-26T20:29:59-07:00的格式2011-10-26T20:29:59-07:00

时区模式来自Javadate时间 – 自定义date格式模式

  • X
     Zone offset Example: X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45 

这已经过了一段时间,但是在尝试使用GSONparsing具有这种date格式的API响应时遇到了这个问题。 我想我会分享我用正则expression式写的2个小函数来find所有的date,并把它们改成GSON可以parsing的格式。

 private static String cleanDateFormat(String json){ // takes in a string of JSON Pattern regex = Pattern.compile("\\d\\d:\\d\\d:\\d\\d[-\\+]\\d\\d:\\d\\d"); Matcher regexMatcher = regex.matcher(json); StringBuffer buff = new StringBuffer(); while(regexMatcher.find()){ regexMatcher.appendReplacement(buff, getSubOfMatch(regexMatcher)); } regexMatcher.appendTail(buff); return buff.toString(); } //then pull out the colon. private static String getSubOfMatch(Matcher matcher){ StringBuilder sb = new StringBuilder(matcher.group(0)); sb.deleteCharAt(sb.length()-3); return sb.toString(); } 

我的api响应date格式与您的完全相同,如下所示:

 "weather": { "temperature": 31, "time": "2016-06-23T09:28:38+08:00" } 

在Android项目中,我使用下面的代码,都为我工作。

 Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); // or, also work Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") .create(); 

"yyyy-MM-dd'T'HH:mm:ssX"在Android中不起作用,尽pipe我在build.gradle使用了Java 8。

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 

我们如何知道我们应该设置的date格式,实际上你可以从SimpleDateFormat.java的源代码中find答案:

  * <p>Which produces this output when run in the America/Los_Angeles time zone: * <pre> * yyyy-MM-dd 1969-12-31 * yyyy-MM-dd 1970-01-01 * yyyy-MM-dd HH:mm 1969-12-31 16:00 * yyyy-MM-dd HH:mm 1970-01-01 00:00 * yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800 * yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000 * yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800 * yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000 * yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800 * yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000 * </pre>