web-dev-qa-db-ja.com

「2011-10-26T20:29:59-07:00」のGsonBuilder setDateFormat

Jsonで2011-10-26T20:29:59-07:00として日付/時刻を取得しています。 gsonBuilder.setDateFormatを使用して今回適切にフォーマットする適切な方法は何ですか?

49
LuxuryMode

-07:00はISO 8601タイムゾーン表記です。これは、 Java 7 までSimpleDateFormatでサポートされていません。したがって、 pgrade to Java 7)が可能な場合、Xを使用してそのタイムゾーン表記を表すことができます。

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

Java 6 では、-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();
95
BalusC

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

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

私のAPIレスポンスの日付形式は次のようにあなたのものとまったく同じです:

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

in Android project、私は次のコードを使用します。両方とも私のために働きます。

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>
5
Spark.Bao

これが投稿されてからしばらく経ちましたが、GSONを使用してこの日付形式のAPI応答を解析しようとすると、それに遭遇しました。正規表現を使用して作成した2つの小さな関数を共有して、すべての日付を検索し、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();
}
4
JoeLallouz