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

问题描述 投票:6回答:3

我想在一些pattern中的字符串的UNIX纪元时间(Posix Time,Unix Time),字符串是正常格式(所以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创建DateTimeFormatter.ofPattern(pattern)有任何开销吗?如果是这样的话?

java scala datetime java-8 epoch
3个回答
2
投票

这个缩短了两倍以上(只有3个方法调用):

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
     LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
                  .toEpochSecond(ZoneOffset.UTC)

顺便说一句,我会在DateTimeFormatter之外构建dateTimeStringToEpoch并将其作为方法参数传递:

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

3
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.