2012-11-24 68 views
4

可能重複:
Converting ISO8601-compliant String to java.util.Date的Java:如何獲取當前日期在ISO 8601第二種格式

我需要在ISO 8601的當前日期SS毫秒HH:MM時區

完成日期加小時,分鐘,秒和小數 秒的分數:YYYY-MM-DDThh:mm:ss.sTZD(例如1997-07-16T19:20:30。 45 + 01:00

見:http://www.w3.org/TR/NOTE-datetime

我嘗試不同的方法,但我不能得到正確的毫秒&時區的數字:

DateFormat df=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSZZ"); 
df.setTimeZone(TimeZone.getTimeZone("UTC")); 
df.format(new Date()); 

JAVA結果: 2012-11 -24T21:19:27。 758 + 0000

Apache結果: 2012-11-24T21:19:27。 758 + 00:00(Apache的百科全書FastDateFormat)

+0

毫秒是「SSS」而不是「SS」 –

+0

是的......該問題有非常完整的答案。 – marcolopes

+2

不,不是重複。這個問題是關於*生成*字符串,而另一個關於*解析*字符串。 –

回答

5

其實有在JDK一個類來處理解析和格式化ISO8601:

import javax.xml.bind.DatatypeConverter; 

DatatypeConverter.printDateTime(new GregorianCalendar()) 
//2012-11-24T22:42:03.142+01:00 
+0

我的困惑是,所有的例子都顯示2位毫秒,但ISO文檔真的說:完整日期加上小時,分鐘,秒和***小數部分***第二個 – marcolopes

+0

@marcolopes [ISO 8601]( https://en.m.wikipedia.org/wiki/ISO_8601)標準允許小數點後的任意位數作爲您希望的幾分之一秒,前提是數據的接收者可以處理該粒度。對於毫秒,您需要三位小數位,微秒六位數,以及納秒九位數。請注意,舊的日期時間類使用毫秒,數據庫像Postgres使用micros,而java.time類使用毫微秒。 –

+1

這個答案在過去提供了一個很好的解決方法。現在幸運的是,我們有Java 8及更高版本中內置的java.time類,以及用於Java 6和7以及Android的後端端口。 –

1

java.time

內置的Java 8 java.time framework並在以後使用ISO 8601時解析或生成日期時間值的文本表示時默認。

InstantUTC中時間軸上的一個時刻,分辨率爲nanoseconds

Instant instant = Instant.now(); 

但是你想要一個特定的offset-from-UTC。因此請指定ZoneOffset以獲得OffsetDateTime

ZoneOffset offset = ZoneOffset("+01:00"); 
OffsetDateTime odt = OffsetDateTime.ofInstant(instant , offset); 

要生成ISO 8601的字符串,只需調用toString

String output = odt.toString(); 

轉儲到控制檯。在輸出中請注意,小時是如何調整的,作爲+01:00偏移的調整,甚至在午夜時間翻轉,因此日期從第12天改變爲第13天。

System.out.println ("instant: " + instant + " | offset: " + offset + " | odt: " + odt); 

瞬間:2016-04-12T23:12:24.015Z |偏移量:+01:00 | odt:2016-04-13T00:12:24。015 + 01:00

分區

順便說一句,這是更好地利用時區(如果知道)不只是一個單純的偏移。時區是偏移量處理異常情況(如夏令時(DST))的規則。

在java.time中,表示應用ZoneId獲取ZonedDateTime

ZoneId zoneId = ZoneId.of("Europe/Paris"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 
相關問題