web-dev-qa-db-ja.com

RFC 3339タイムスタンプをJava

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")
37
Cristian

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
40
Daniel Beck

Joda Time パッケージをチェックしてください。これにより、RFC 3339の日付の書式設定が大幅に容易になります。

ジョーダの例:

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

"get it done dept"からの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)$", "$1:$2");
}
12
jjohn

私は同じ問題の答えを探すためにかなりの時間を費やし、ここで何かを見つけました: http://developer.Android.com/reference/Java/text/SimpleDateFormat.html

推奨される回答:

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

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

11
Rahul Ravindran

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

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

あなたが正確に必要なものではありませんか?

3
FoxyBOA

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

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

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

1
Bladean Mericle

この問題を解決するために迷子のペーストビンを見つけました: 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");
1
crockpotveggies