首页 > 解决方案 > 如何在 Java 8(Scala)中将日期时间字符串转换为长(UNIX 纪元时间)

问题描述

我想要一些字符串的 UNIX 纪元时间(Posix 时间,Unix 时间)pattern,该字符串是正常格式的(所以是 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创建via是否有任何开销DateTimeFormatter.ofPattern(pattern)?如果是,为什么?

标签: javascaladatetimejava-8epoch

解决方案


您可以使用与以下 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)意味着在多次遇到相同的模式字符串时可以避免的工作。这些工作量是否与您的应用程序相关,取决于除此操作之外正在做什么。


推荐阅读