Java 时间即时格式差异

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

因此,仅生成和解析时间戳似乎很复杂且不一致。还是我做错了?

最佳答案

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

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

当然,您可以使用DateTimeFormatter.ISO_INSTANT解析InstantDateTimeFormatter.ISO_INSTANT.parse(text, Instant::from) - 这就是 Instant.parse(...) 的作用。

关于Java 时间即时格式差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127121/

相关文章:

java - 通用方法类型安全

java - Weka - 组合具有不同 header 的 arff 文件

php - Unix 时间戳转换回夏令时

c# - 在 Noda Time 中获取系统的 LocalDateTime

java - 为什么要获得具有相同时区的不同 localDate

java - 如何使用java时间通过从语言标签获得的任何区域设置来格式化日期?

java - 用 Java 计算 PI。值错误

java - 在 Android 中将 LatLng 偏移一定量的米

Java:WAITING函数最多n秒,如果没有完成重试

java - 如何使用 LocalDateTime.parse(...) 解析 ISO 日期