我想要一些 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
是否有任何开销?如果是,为什么?
最佳答案
这个要短两倍以上(只有 3 个方法调用):
def dateTimeStringToEpoch(s: String, pattern: String): Long =
LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
.toEpochSecond(ZoneOffset.UTC)
顺便说一句,我会在 dateTimeStringToEpoch
之外构建 DateTimeFormatter
并将其作为方法参数传递:
def dateTimeStringToEpoch(s: String, formatter: DateTimeFormatter): Long =
LocalDateTime.parse(s, formatter).toEpochSecond(ZoneOffset.UTC)
实际运行性能测试后,在方法外初始化 DateTimeFormatter
的性能差异很小(几乎是 2 倍)。
scala> val pattern = "yyyy/MM/dd HH:mm:ss"
pattern: String = yyyy/MM/dd HH:mm:ss
scala> time(() => randomDates.map(dateTimeStringToEpoch(_, pattern)))
Took: 1216
scala> time(() => randomDates.map(dateTimeStringToEpochFixed))
Took: 732
关于java - 如何在 Java 8 (Scala) 中将日期时间字符串转换为长(UNIX 纪元时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54346584/