java - 如何在 Java 8 (Scala) 中将日期时间字符串转换为长(UNIX 纪元时间)

标签 java scala datetime java-8 epoch

我想要一些 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))

到目前为止,我有以下内容,但出于多种原因我讨厌它:

  1. 对于最常见的日期处理(转换为 UNIX 大纪元时间)而言,它过于冗长了。 7 方法调用应该是 1。
  2. 它必须指定 UTC,但 UTC 肯定只是默认值,为什么我必须在这里明确说明?
  3. 它有一个字符串文字 "UTC"
  4. 它有一个神奇的数字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/

相关文章:

java - 如何使用 mongodb java 驱动程序导入/导出 MongoDB 数据库的所有集合?

scala - 如何将 chisel 中的测试平台与 C++ 库集成?

java - 如何在各自的测试文件夹中为每个测试生成 cucumber.json (我使用的是 Cucumber 5,它使用 TestNG 进行并行执行)

scala - 从 hive 表中获取数据到 spark 并在 RDD 上执行连接

scala - 将字符串的 Scala 列表转换为 double 列表,同时丢弃不可转换的字符串

python-3.x - 在Python3中将时间戳浮点转换为日期时间

java - 无法解析的日期异常 SimpleDateFormat

python - Django 管理员 : rendering page to add new object fails only when datetime field is included in fieldset

Java F-Bound 通过接口(interface)绑定(bind)

java - 我应该在客户端计算机上使用 JVM 还是 JRE 来运行嵌入式 Java DB?