Java时间格式差异

时间:2016-12-13 17:28:00

标签: java time java-time

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(…)

因此,生成和解析时间戳似乎是错综复杂且不一致的。或者我做错了吗?

3 个答案:

答案 0 :(得分:2)

首先,您可以DateTimeFormatter.ISO_INSTANT.format(Instant.now())

接下来,我不明白为什么你希望解析你格式化的内容。格式化不保证是无损操作。如果您只使用年份格式化LocalDateTime,则不希望将其解析回LocalDateTime,是吗?

当然,您可以使用Instant解析DateTimeFormatter.ISO_INSTANTDateTimeFormatter.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);吗?