GsonBuilder setDateFormat для «2011-10-26T20: 29: 59-07: 00» - PullRequest
49 голосов
/ 27 октября 2011

Я получаю дату / время в формате json как 2011-10-26T20:29:59-07:00. Как правильно использовать gsonBuilder.setDateFormat, чтобы правильно отформатировать это время?

Ответы [ 4 ]

95 голосов
/ 27 октября 2011

-07:00 - это обозначение часового пояса ISO 8601. Это не поддерживается SimpleDateFormat до Java 7 . Итак, если вы можете обновить до Java 7, то вы можете использовать X для представления обозначения часового пояса:

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

На Java 6 вам нужно сначала выполнить некоторое сопоставление с образцом и заменить строку JSON, чтобы заменить часть -07:00 на нотацию RFC 822 -0700, чтобы вы могли использовать 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();
9 голосов
/ 27 августа 2015

Для Java 8 (не проверено для Java 7), просто используйте шаблон

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

Чтобы получить точно формат 2011-10-26T20:29:59-07:00.

Шаблон часового пояса: Java Date Time - шаблоны пользовательских форматов даты

  • X
    Zone offset
    Example:
        X       +09
        XX      +0930 
        XXX     +09:30
        XXX     -05:00
        XXXX    +093045
        XXXXX   +08:30:45
    
5 голосов
/ 23 июня 2016

Формат даты моего ответа 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, хотя я настроил использовать Java 8 в build.gradle.

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

как мы узнаем, какой формат даты мы должны установить, на самом деле вы можете найти ответ изисходный код SimpleDateFormat.java:

<code> * <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
 * 
4 голосов
/ 22 ноября 2012

Прошло много времени с тех пор, как это было опубликовано, но натолкнулось на это при попытке использовать 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...