如何解析包含年积日与任意长度亚秒位的LocalDateTime格式
解决方案
你遇到的问题可以通过两步调整直接解决,不需要额外加补零等特殊逻辑:
- 调整亚秒位正则匹配范围:将原正则中亚秒位的
[0-9]{1,6}修改为[0-9]{1,9},支持最多9位亚秒(纳秒级,覆盖JavaLocalDateTime支持的最高精度) - 使用9位亚秒格式模板:Java 的
DateTimeFormatter对亚秒格式符S是宽松匹配的,只要输入的亚秒位数不超过模板中S的数量即可正常解析,不需要位数完全对齐,所以直接用yyyy-DDD'T'HH:mm:ss.SSSSSSSSS(9个S)作为带亚秒时间的模板即可适配1~9位任意长度的亚秒输入。
修改后对应的正则映射项
替换你代码中对应的映射项即可:
// 原带亚秒的映射项替换为如下内容 .put("(-)?[0-9]{4}-((00[1-9])|(0[1-9][0-9])|([1-2][0-9][0-9])|(3(([0-5][0-9])|(6[0-6]))))(T)(([0-1][0-9])|(2[0-3])):[0-5][0-9]:(([0-5][0-9])|60)(\\.([0-9]{1,9}))?(Z?)", "yyyy-DDD'T'HH:mm:ss.SSSSSSSSS")
补充注意事项
- 请确保该带亚秒的正则项在映射表中排在不带亚秒的同级别正则项之前,避免短正则先匹配返回错误模板
- 你原代码中年份匹配对应的模板
YYYY是基于周的年份,若需要标准公历年请替换为yyyy,避免跨年周的时间解析错误 - 若你需要支持超过9位的亚秒输入,可将正则的
{1,9}上限进一步调大,LocalDateTime会自动截断超出纳秒精度的部分,不会抛出解析异常
内容的提问来源于stack exchange,提问作者Frank Harris
相关产品推荐
相关产品推荐

