java - Java LocalDateTime.parse 具有毫秒精度,但可选微秒精度
问题描述
有没有一种方法可以创建一个 LocalDateTime 模式,该模式将解析具有至少毫秒精度但可选微秒精度的日期/时间,即在接下来的毫秒日期/时间解析正常,但第二个以微秒为单位失败。我认为模式“[”“]”中的可选指标将允许这项工作:
DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS[SSS]");
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784", DATE_TIME_FORMATTER));
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784108", DATE_TIME_FORMATTER));
解决方案
哈克没有。1
String withMillis = "2019-02-14 11:04:52.784";
String withMicros = "2019-02-14 11:04:52.784108";
System.out.println(LocalDateTime.parse(withMillis.replace(' ', 'T')));
System.out.println(LocalDateTime.parse(withMicros.replace(' ', 'T')));
2019-02-14T11:04:52.784 2019-02-14T11:04:52.784108
当我们用 a 替换字符串中间的空格时T
,字符串符合 ISO 8601,标准格式LocalDateTime
和 java.time 的其他类解析(以及打印)作为它们的默认值,即没有任何显式格式化程序. 所以这是一个简单的解决方案。
哈克没有。2
可以使您尝试过的东西起作用。只有您不能SSSSSS
在中间使用方括号拆分序列。
static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");
进而:
System.out.println(LocalDateTime.parse(withMillis, DATE_TIME_FORMATTER));
System.out.println(LocalDateTime.parse(withMicros, DATE_TIME_FORMATTER));
我可选择指定 6 位小数,然后可选择 3 位小数。我们需要那个命令。如果我们[SSS][SSSSSS]
输入并尝试解析 6 位小数,格式化程序将首先解析 3,然后抛出异常,因为它无法解析剩余的 3 位SSSSSS
。这有点 hack,因为它也将接受一个完全没有小数的小数点,如果我们给它 9 个小数,它可能会发出一个非常令人困惑的错误消息(甚至可能给出不正确的结果)。
好的解决方案:使用构建器
编辑:自从这个答案的第一个版本以来,我已经稍微改进了构建器:
static final DateTimeFormatter DATE_TIME_FORMATTER =
new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
DateTimeFormatter.ISO_LOCAL_TIME
在秒上解析 0 到 9 位小数,因此我们只需在我们自己的格式化程序中重用该格式化程序。
原始建设者:
static final DateTimeFormatter DATE_TIME_FORMATTER =
new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.appendPattern("HH:mm:ss")
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
.toFormatter();
在这里,我指定了小数点后最少 1 位和最多 9 位小数。如果您愿意,可以指定 3 和 6。它当然也会接受 4 或 5。
链接: 维基百科文章:ISO 8601
推荐阅读
- laravel - SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(未修复)
- python - 如何使用 matplotlib 将矩阵绘制为距离与时间的关系图?
- javascript - 动画不适用于 d3 折线图
- r - 使用 lapply 从多个 lmer 模型中提取系数
- kubernetes - 如何从指标服务器获取网络信息
- laravel - 是否可以在刀片模板中操作 laravel @yield 的输出?
- mysql - 在“包含”模型字段中查询空数组
- r - 如何在 R 中使用 dplyr 添加一个新列来计算每个组的平均值
- google-sheets - 根据单元格值在单元格值范围内的位置查找索引位置
- sql - 为什么 postgres 不能正确映射列