我想在一些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))
到目前为止,我有以下内容,但我讨厌这个原因有很多:
"UTC"
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)
有任何开销吗?如果是这样的话?
这个缩短了两倍以上(只有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
您可以使用以下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)
意味着在多次遇到相同的模式字符串时可以避免的工作。这项工作量是否与您的应用程序相关,取决于此操作旁边的操作。
你可以试试这个吗,根据你所说的,解析UTC时间,所以我把它作为样本。
Instant.parse("2019-01-24T12:48:14.530Z").getEpochSecond