是否有一种创建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));
答案 0 :(得分:2)
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
替换字符串中间的空格时,该字符串符合ISO 8601,LocalDateTime
和java.time解析的其他类的标准格式(以及打印)作为默认设置,即没有任何显式格式化程序。因此,这是一个简单的解决方案。
可以使您尝试的工作正常。只有您不能拆分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(' ')
.appendPattern("HH:mm:ss")
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
.toFormatter();
在此,我指定了小数点后的最小值1和最大值9。如果愿意,可以指定3和6。当然,它也会接受4或5。