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

时间:2011-10-27 01:18:10

标签: java date gson

我在json中得到2011-10-26T20:29:59-07:00的日期/时间。使用gsonBuilder.setDateFormat正确格式化此时间的正确方法是什么?

4 个答案:

答案 0 :(得分:94)

-07:00是ISO 8601时区表示法。在Java 7之前,SimpleDateFormat不支持此功能。因此,如果您可以upgrade到Java 7,那么您可以使用X来表示该时区符号:

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

Java 6上,您需要先进行一些模式匹配并替换JSON字符串,以便用RFC 822表示法-07:00替换-0700部分,以便您可以使用{{ 1}}:

Z

或通用时区符号Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); ,以便您可以使用GMT-07:00

z

答案 1 :(得分:9)

对于Java 8(尚未验证Java 7),只需使用模式

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

准确了解2011-10-26T20:29:59-07:00

的格式

时区模式来自Java Date Time - Custom Date Format Patterns

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

答案 2 :(得分:5)

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

"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中不起作用,尽管我已经在build.gradle中使用了Java 8。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

我们如何知道我们应该设置的日期格式,实际上您可以从SimpleDateFormat.java的源代码中找到答案:

 * <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>

答案 3 :(得分:4)

自发布以来已经有一段时间了,但在尝试使用GSON解析具有此日期格式的API响应时,它已经出现了。我想我会分享我使用正则表达式编写的两个小函数来查找所有日期并将它们更改为GSON随后可以解析的格式。

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();
}