如何在 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。
(毫秒请见)
到目前为止我有以下内容,但出于多种原因我讨厌它:
- 对于最常见的日期处理(转换为 UNIX 大纪元时间)而言,它过于冗长了。 7 方法调用应该是 1.
- 它必须指定UTC,但UTC肯定只是一个默认值,为什么我必须在这里明确?
- 它有一个字符串文字
"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.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)
意味着多次遇到相同模式字符串时可以避免的工作。这个工作量是否与您的应用程序相关,取决于此操作旁边正在做什么。
我想要一些pattern
中字符串的UNIX Epoch Time(Posix时间,Unix时间),字符串是正常格式(所以UTC)。请使用 Java 8,而不是 Joda 或旧的 Java。
(毫秒请见
到目前为止我有以下内容,但出于多种原因我讨厌它:
- 对于最常见的日期处理(转换为 UNIX 大纪元时间)而言,它过于冗长了。 7 方法调用应该是 1.
- 它必须指定UTC,但UTC肯定只是一个默认值,为什么我必须在这里明确?
- 它有一个字符串文字
"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.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)
意味着多次遇到相同模式字符串时可以避免的工作。这个工作量是否与您的应用程序相关,取决于此操作旁边正在做什么。