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

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

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

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

但是它有一些不受支持的字段:Instant.getLong(…)中的YearOfEra,我对此有所了解.现在用什么而不是Instant?

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

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,当您想要在没有任何其他上下文的情况下及时存储时,Instant是正确的类.

转载注明原文:Java 8 epoch-millis时间戳到格式化日期,怎么样? - 代码日志