gpt4 book ai didi

Java 8 epoch-millis 时间戳格式化日期,怎么样?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:43 25 4
gpt4 key购买 nike

在 Java-8 之前,我习惯于始终将任何与 Epoch 相关的日期/时间保持为毫秒,并且只在输出时处理人类可读的日期/时间,即在 UI 或日志文件中,或者在解析用户时生成的输入。

我认为这对于 Java-8 仍然是安全的,现在我正在寻找最简洁的方法来从毫秒时间戳中获取格式化日期。我试过了

df = Dateformatter.ofPattern("...pattern...");
df.format(Instant.ofEpochMilli(timestamp))

但它在 Instant.getLong(...) 中用 Unsupported field: YearOfEra 轰炸了我一半的理解。现在用什么代替 Instant

LocalDateTime.ofEpoch(Instant, ZoneId) 似乎是错误的,因为我不关心本地时间。我只想在应用格式化程序时查看本地时区。在内部它应该只是 Instant

ZonedDateTime.ofInstant(Instant, ZoneId)也是一样,我想只在格式化时应用ZoneId。但我注意到 DateTimeFormatter 本身似乎不再处理时区,所以我认为我需要使用上述之一。

首选哪一个,为什么?或者我应该使用另一种方法将 epoch-millis 时间戳格式化为带时区的日期/时间吗?

最佳答案

Instant 不包含任何有关时区的信息,并且与其他地方不同,不会自动使用默认时区。因此,格式化程序无法确定年份,因此会出现错误消息。

因此,要格式化瞬间,您必须添加时区。这可以使用 withZone(ZoneId) 直接添加到格式化程序中- 无需手动转换为 ZonedDateTime *:

ZoneId zone = ZoneId.systemDefault();
DateTimeFormatter df = DateTimeFormatter.ofPattern("...pattern...").withZone(zone);
df.format(Instant.ofEpochMilli(timestamp))

* 遗憾的是,在早期的 Java 8 版本中,DateTimeformatter.withZone(ZoneId) 方法不起作用,但是现在已经修复了,所以如果上面的代码不起作用,请升级到最新的 Java 8 补丁版本。

编辑:只需添加 Instant 是当您想在没有任何其他上下文的情况下及时存储瞬间时使用的正确类。

关于Java 8 epoch-millis 时间戳格式化日期,怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38684650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com