2017-02-21 63 views
0

如何在ISO 8601中格式化日期?例如:2009-06-15T13:45:30獲取ISO 8601日期格式,例如:2009-06-15T13:45:30

是否有從Java生成它的標準方式,而不必使用字母模式創建DateTimeFormatter

我看到它MS文檔中使用: Standard Date and Time Format Strings

+1

https://en.wikipedia.org/wiki/ISO_8601 –

+1

這是ISO 8601格式,您可以使用「s」(可排序)格式說明符(在C#中)格式化字符串。 – Evk

+1

@Evk *幾乎* ISO 8601格式 - 缺少時區標識符。 – 1615903

回答

0

簡單的方式來獲得ISO 8601在Java中:

static void time() { 
    final DateTimeFormatter fmt = DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
    OffsetDateTime.now().truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    Instant.now().atOffset(ZoneOffset.ofHours(1)).truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    Instant.now().atOffset(ZoneOffset.UTC).truncatedTo(ChronoUnit.SECONDS).format(fmt); 
    OffsetDateTime.parse("2007-12-03T10:15:30+01:00").format(fmt); 
    LocalDateTime.parse("2009-06-15T13:45:30").format(fmt); 
} 
3

我想這就是通常所說的「ISO」的日期。

wikipedia記錄在案],並舉例如:

Date: 2017-02-21 
Combined date and time in UTC: 2017-02-21T10:26:42+00:00 
           2017-02-21T10:26:42Z 
           20170221T102642Z 

的一兩件事是明確的:你的例子去無任何時區信息;所以他們應該被認爲是「當地時間」。

3

在此字符串中,T只是表示爲<date>T<time>的標準ISO 8601日期時間字符串中的時間分量。維基百科對此標準格式有一個detailed page

在java中,你可以做到這一點使用它

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 

我用GMT這裏只是舉例。您可以根據需要設置時區。約TimeZone在這裏得到更多的信息是文檔link

+1

只是爲了記錄:「Z」暗示UTC(呃,實際上沒有時區);是的,格林尼治標準時間在某種程度上是UTC,但我認爲確切的說,你應該在你的例子中使用「UTC」。 – GhostCat

+0

我寫了GMT,因爲我曾經讀過「GMT是時區,UTC是時間標準」,因此我想當我嘗試getTimeZone()時,我提到了時區。^_^@GhostCat –

+0

我同意,這不是很清楚。也許更好的解決方案是在你的答案中提及術語部分。 – GhostCat

2

ISO-8601 在單個時間點可以通過連接一個完整的日期表達,字母T作爲分隔符,並有效的時間表達式來表示。例如,「2007-04-05T14:30」。

2

這種日期的格式是當地日期時間ISO 8601,沒有時區。 根據根據ISO 8601表示維基百科,日期和時間是:

Date:       2017-02-21 

Combined date and time in UTC: 2017-02-21T12:34:46+00:00 
           2017-02-21T12:34:46Z 
           20170221T123446Z 
... 

有很多種方法可以創建在Java這樣的格式字符串。在Java 8中,最簡單的方法是使用內置的解析模式LocalDateTime。我不使用ZonedDateTime的原因是這個日期的時區是未知的。

// str -> date 
LocalDateTime d = LocalDateTime.parse("2009-06-15T13:45:30"); 

// date -> str 
String text = d.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); 

ISO 8601: Time zone designators

+0

更正:[ISO 8601](https://en.m.wikipedia.org/wiki/ISO_8601)標準定義並允許使用不帶偏移量*的「本地」日期 - 時間值。 –

+0

感謝您檢閱我的回答@BasilBourque。答案現在更新:) –

相關問題