繁体   English   中英

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

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

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

(有关毫秒的信息,请参阅如何将日期时间字符串转换为long(UNIX纪元时间)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是否有任何开销? 如果是这样的话?

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

这个缩短了两倍以上( 只有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

你可以试试这个吗,根据你所说的,解析UTC时间,所以我把它作为样本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM