質問

PSTオフセット付きのタイムスタンプを出力したい(例:2008-11-13T13:23:30-08:00)。 java.util.SimpleDateFormat は、 hour:minute 形式のタイムゾーンオフセットを出力しないようです。コロンは除外されます。 Javaでそのタイムスタンプを取得する簡単な方法はありますか?

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

また、 SimpleDateFormat は上記の例を正しく解析できません。 ParseException をスローします。

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
役に立ちましたか?

解決

Java 7以降、ISO8601タイムゾーンの X パターン文字列があります。説明した形式の文字列には、 XXX を使用します。 ドキュメントを見る

>

サンプル:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
        .format(new Date()));

結果:

2014-03-31T14:11:29+02:00

他のヒント

Joda Time パッケージをご覧ください。これにより、RFC 3339の日付の書式設定がはるかに簡単になります。

Jodaの例:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);

「終了」から、「」 1つの解決策は、SimpleDateFormatの完了後に正規表現を使用して文字列を修正することです。 Perlのs /(\ d {2})(\ d {2})$ / $ 1:$ 2 /のようなもの。

これに少しでも興味がある場合は、動作するJavaコードでこの応答を編集します。

しかし、ええ。私もこの問題に直面しています。 RFC3339、私はあなたを見ています!

編集:

これは私のために動作します

// As a private class member
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

String toRFC3339(Date d)
{
   return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)<*>quot;, "$1:$2");
}

同じ問題に対する回答を探すのにかなりの時間を費やし、ここで何かを見つけました: http://developer.android.com/reference/java/text/SimpleDateFormat.html

推奨される回答:

String timestamp = new SimpleDateFormat(&quot; yyyy-MM-dd'T'h:m:ssZZZZZ&quot;)。format(new Date());

お気づきの場合、1つではなく5つの「Z」を使用しています。これにより、「2008-11-13T12:23:30-08:00」のようなオフセットにコロンが付いた出力が得られます。役に立てば幸いです。

問題は、Zが区切り文字としてコロン(:)なしでタイムゾーンオフセットを生成することです。

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");

必要なものではないですか?

この問題を解決するのに役立つ迷子のPasteBinを見つけました: http://pastebin.com/y3TCAikc

その内容が後で削除される場合に備えて:

// I want 2008-11-13T12:23:30-08:00
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date());
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference?

// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");

RFC3339の InternetDateFormat クラスを作成しました。

ただし、ソースコードのコメントは日本語です。

PS:英語版を作成し、少しリファクタリングしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top