是否有一种方法可以创建一个LocalDateTime模式,该模式将解析至少具有毫秒精度但可选的微秒精度的日期/时间,即在随后的毫秒日期/时间被解析为ok,但第二个模式在微秒内失败。我认为“模式中的可选指标将允许这项工作:
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));发布于 2019-02-14 08:08:59
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
当我们用T替换字符串中间的空格时,字符串符合ISO8601的标准格式,这是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,然后抛出一个异常,因为它不能用SSSSSS解析其余的3。这有点麻烦,因为它也会接受小数点,一点小数点都没有,如果我们给出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
https://stackoverflow.com/questions/54682028
复制相似问题