java - 如何在 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))
到目前为止,我有以下内容,但出于多种原因我讨厌这个:
- 对于日期最常见的事情(转换为 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
创建via是否有任何开销DateTimeFormatter.ofPattern(pattern)
?如果是,为什么?
解决方案
您可以使用与以下 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)
意味着在多次遇到相同的模式字符串时可以避免的工作。这些工作量是否与您的应用程序相关,取决于除此操作之外正在做什么。
推荐阅读
- reactjs - React - 通过路由器更改组件
- python - 使用 groupby 并创建具有百分比频率的列
- java - 以编程方式传递 keytab 位置失败(Kafka / Kerberos)
- html - 带有文本覆盖和背景颜色的背景图像甚至可以响应 4k 屏幕
- python - ansible AWX 不显示 python 打印语句,但 ansible-playbook 显示
- javascript - 如何只允许在全日历中选择背景事件的第一天?
- jquery - RSpec + Capybara + Selenium Webdriver:测试模态按钮触发选中一个框的jquery不起作用
- mysql - 使用 LOAD DATA INFILE 将数据从 txt 文件加载到 MySQL 时遇到问题
- c - 如何使用 void 指针参数构造 C 函数并在运行时有条件地将它们转换为其他类型?
- python - 调用 PyPI 包中的其他脚本