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(…)
?
因此,生成和解析时间戳似乎是错综复杂且不一致的。或者我做错了吗?
答案 0 :(得分:2)
首先,您可以DateTimeFormatter.ISO_INSTANT.format(Instant.now())
。
接下来,我不明白为什么你希望解析你格式化的内容。格式化不保证是无损操作。如果您只使用年份格式化LocalDateTime
,则不希望将其解析回LocalDateTime
,是吗?
当然,您可以使用Instant
解析DateTimeFormatter.ISO_INSTANT
。 DateTimeFormatter.ISO_INSTANT.parse(text, Instant::from)
- 这就是Instant.parse(...)
所做的。
答案 1 :(得分:1)
format(DateTimeFormatter)
中不需要Instant
方法,因为toString()
完成了这项工作。 toString()
的{{1}}方法实现为:
Instant
因此,您需要做的就是致电return DateTimeFormatter.ISO_INSTANT.format(this);
。
要往返解析此问题,只需使用instant.toString()
:
parse()
答案 2 :(得分:-1)
为什么在解析字符串时需要重新指定格式化程序?
你不能只做ZonedDateTime.parse(timestamp);
吗?