2008-11-14 363 views
32

我想輸出帶有PST偏移量的時間戳(例如2008-11-13T13:23:30-08:00)。 java.util.SimpleDateFormat似乎不會在小時:分鐘格式中輸出時區偏移量,它將排除冒號。有沒有簡單的方法來獲取Java中的時間戳?輸出RFC 3339 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") 

回答

31

從Java 7開始,ISO8601時區有X模式字符串。對於您描述的格式的字符串,請使用XXXSee the documentation

樣品:

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

結果:

2014-03-31T14:11:29+02:00 
2
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ"); 

不正是你所需要的?

+0

不可以。如果您嘗試解析上面給出的時間戳,它將拋出ParseException。 – Cristian 2008-11-19 04:11:59

+0

適用於「2008-11-13T13:23:30-0800」。 – FoxyBOA 2008-11-19 08:02:38

+3

這與上面的日期格式不一樣。 – 2012-06-07 11:33:12

13

查看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); 
+2

這個答案實際上對於一個例子很有用。 – noah 2011-01-23 21:35:57

+1

@Biff你可以簡化你的代碼示例。無需格式化程序。 Joda-Time自動默認爲[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)/ [RFC 3339](http://www.ietf.org/rfc/rfc3339.txt)格式。只需調用`toString`方法,顯式或隱式地調用。像這樣,`String output = dt.toString();` – 2014-03-31 14:18:50

4

問題是是Z產生的時區沒有結腸偏移(:)作爲分隔符。

11

從「get it done dept」開始,一種解決方案是在SimpleDateFormat完成後使用regexes修正字符串。像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"); 
} 
1

我發現了一個流浪引擎收錄,幫助我走出這個問題: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"); 
0

我做了一個InternetDateFormat類RFC33 39。

但是源代碼註釋是日文。 PS:我創建了英文版,並重構了一些內容。

9

我花了很多時間尋找的答案,同樣的問題,我發現這裏的東西:http://developer.android.com/reference/java/text/SimpleDateFormat.html

建議的答覆:

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

如果您發現我正在使用5'Z'而不是一個。這樣就給出了輸出結果,如下所示:「2008-11-13T12:23:30-08:00」。希望能幫助到你。