2016-12-13 121 views
0

Java時間處理時間戳等簡單事情的方式讓我有點吃驚。也許我做錯了。Java時間即時格式化差異

我想生成一個ISO 8601時間戳字符串。顯而易見的方法是創建一個Instance.now()並將其格式化爲DateTimeFormatter.ISO_INSTANT以對其進行格式化。除了Instance沒有format()方法,所以我不能用「實例」格式化程序對其進行格式化。想象一下。

所以我必須從實例創建一個ZonedDateTime。它不應該的問題,我選擇哪個區域,所以我選擇UTC,因爲這是DateTimeFormatter.ISO_INSTANT是打算把它反正:

Instant.now().atZone(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT) 

現在我回來一個字符串,很明顯,我想這回ZonedDateTime實例,因爲這是我用來格式化的!所以我嘗試:

ZonedDateTime.parse(timestamp, DateTimeFormatter.ISO_INSTANT) 

它抱怨我沒有時區信息。但我使用了ZonedDateTime來生成它 - 這不是我的錯,它不會讓我用Instance來格式化它。

奇怪Instance沒有format()方法,但它確實有一個parse()方法,其中,再次奇怪的是,使用DateTimeFormatter.ISO_INSTANT解析的(雖然我不能格式使用格式化的Instance)。

正如評論中指出的那樣,我可以使用DateTimeFormatter.ISO_INSTANT.format(Instance.now())直接格式化一個實例,爲什麼沒有Instance.format(…)

因此,生成和解析時間戳看起來很複雜且不一致。還是我做錯了?

+1

你可以通過'Instant'到'DateTimeFormatter.ISO_INSTANT.format(...)',不是嗎? – lexicore

+0

啊,的確我可以!我錯過了整個'DateTimeFormatter.format(...)'方法。但是,如果'Instant'沒有'format(...)'方法,但它與'DateTimeFormatter.format(...)'一起工作,那很奇怪。然後另一個問題變得更加不一致:我可以使用'DateTimeFormatter.ISO_INSTANCE'格式化一個'Instance',但不能解析它! –

回答

-1

爲什麼在解析字符串時需要重新指定格式化程序? 難道你不能只做ZonedDateTime.parse(timestamp);

2

首先,你可以只是DateTimeFormatter.ISO_INSTANT.format(Instant.now())

接下來,我不明白你爲什麼要分析你已經格式化的東西。格式不保證是無損操作。如果您僅在一年中格式化LocalDateTime,則不會期望將其解析回LocalDateTime,對嗎?

當然你可以使用DateTimeFormatter.ISO_INSTANT解析InstantDateTimeFormatter.ISO_INSTANT.parse(text, Instant::from) - 這是Instant.parse(...)所做的。

+0

「格式不保證是無損操作。」我同意作爲一般性陳述,而且我不想爭論,但當我將「Instant」格式化爲ISO 8601時間戳格式時,究竟是「失去」了什麼?難道我沒有100%的信息來找回原始的「即時」嗎? (我可以通過一些代碼證明給你 - 一些令人費解的代碼,這是我的觀點。) –

+0

感謝提醒我,我可以將這些時間對象傳遞給'DateTimeFormatter.format(...)',以便移除部分差異。但我提到的其他許多人似乎仍然存在。 –

+0

@GarretWilson等一下,你沒有格式化一個'Instant',你已經格式化了'ZonedDateTime',並試着用'ZonedDateTime'解析它。不僅如此,而且您還使用了'DateTimeFormatter.ISO_INSTANT'進行解析(這是您丟失時區的地方)。所以我不明白你怎麼會爭論「回覆最初的'即時'」,因爲這顯然不是你在代碼中所做的。 – lexicore

1

Instant中沒有必要使用format(DateTimeFormatter)方法,因爲toString()可以完成這項工作。實現的InstanttoString()方法:

return DateTimeFormatter.ISO_INSTANT.format(this); 

因此,所有你需要做的就是調用instant.toString()

要往返解析這回,只需使用parse()

Instant instant = Instant.parse(text);