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符号-0700
replace-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>