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

How to convert a date time string to long (UNIX Epoch Time) in Java 8 (Scala)

我想要一些pattern中字符串的UNIX Epoch Time(Posix时间,Unix时间),字符串是正常格式(所以UTC)。请使用 Java 8,而不是 Joda 或旧的 Java。

(毫秒请见

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

  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 是否有任何开销?如果是,为什么?

这个能不能试试看,根据你说的,是解析UTC时间,所以我有这个作为示例。

Instant.parse("2019-01-24T12:48:14.530Z").getEpochSecond

这个短了两倍多(只有 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 代码的等价物:

static long dateTimeStringToEpoch(String s, String pattern) {
    return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)
        .parse(s, p -> p.getLong(ChronoField.INSTANT_SECONDS));
}

当然,处理DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)意味着多次遇到相同模式字符串时可以避免的工作。这个工作量是否与您的应用程序相关,取决于此操作旁边正在做什么。