【发布时间】:2019-06-18 04:26:26
【问题描述】:
我想要一些pattern 中的字符串的UNIX 纪元时间(Posix 时间,Unix 时间),该字符串是正常格式的(所以是UTC)。请使用 Java 8,而不是 Joda 或旧 Java。
(毫秒请见How to convert a date time string to long (UNIX Epoch Time) Milliseconds in Java 8 (Scala))
到目前为止,我有以下内容,但出于多种原因我讨厌这个:
- 对于最常见的日期处理方法(转换为 UNIX 纪元时间)来说,它太冗长了。 7 个方法调用应该是 1。
- 它必须指定UTC,但UTC肯定只是一个默认值,为什么我必须在这里明确?
- 它有一个字符串文字
"UTC" - 它有一个幻数
ZoneOffset.ofHours(0)
目前为止我最好的:
def dateTimeStringToEpoch(s: String, pattern: String): Long =
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
.atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0)))
.toInstant().getEpochSeconds
另外,额外的问题,它有效吗?通过DateTimeFormatter.ofPattern(pattern) 创建DateTimeFormatter 是否有任何开销?如果有,为什么?
【问题讨论】:
-
至少有一个UTC常量
ZoneOffset.UTC -
输入是什么样的?
-
“太冗长了”:这就是为什么在计算机历史的早期就发明了子例程(又名函数或方法)的原因。
-
是的,每次创建
DateTimeFormatter可能都会产生开销。如果担心并且模式相同,请将其设为常数。你可以安全地做到这一点,它是线程安全的。每次调用一个方法调用更少… -
我会认为这个问题是重复的(例如Convert a date format in epoch),但即使我永远不会使用方法调用的计数作为代码质量的指标,也有一些非常答案中出现了有趣的点。
标签: java scala datetime java-8 epoch