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(…)
?
因此,仅生成和解析时间戳似乎很复杂且不一致。还是我做错了?
最佳答案
首先,您可以DateTimeFormatter.ISO_INSTANT.format(Instant.now())
。
接下来,我不明白为什么您希望解析回您格式化的内容。不保证格式化是无损操作。如果仅使用年份格式化 LocalDateTime
,您不会期望将其解析回 LocalDateTime
,不是吗?
当然,您可以使用DateTimeFormatter.ISO_INSTANT
解析Instant
。 DateTimeFormatter.ISO_INSTANT.parse(text, Instant::from)
- 这就是 Instant.parse(...)
的作用。
关于Java 时间即时格式差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127121/