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(…)
?
因此,生成和解析時間戳看起來很複雜且不一致。還是我做錯了?
你可以通過'Instant'到'DateTimeFormatter.ISO_INSTANT.format(...)',不是嗎? – lexicore
啊,的確我可以!我錯過了整個'DateTimeFormatter.format(...)'方法。但是,如果'Instant'沒有'format(...)'方法,但它與'DateTimeFormatter.format(...)'一起工作,那很奇怪。然後另一個問題變得更加不一致:我可以使用'DateTimeFormatter.ISO_INSTANCE'格式化一個'Instance',但不能解析它! –