【问题标题】:Parse nano seconds with less than 6 digits解析小于 6 位的纳秒
【发布时间】:2017-07-25 23:24:44
【问题描述】:
我有时间戳2017-07-25 16:19:59.89384
我想解析它:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
LocalDate time = LocalDateTime.parse(timeStamp, formatter);
但我得到了DateTimeParseException,因为纳秒只有 5 位数。有比在右边填充0 更清洁的解决方案吗?
【问题讨论】:
-
假设这个post 可能对您找到显示纳秒的格式化程序有所帮助。
-
我相信一个选项是timeStamp = timeStamp.replace(' ', 'T');,然后使用单参数LocalDateTime.parse(CharSequence)。我个人更喜欢Hugo’s solution,但这在很大程度上取决于口味。
标签:
java
java-time
datetime-parsing
【解决方案1】:
如果输入 always 有 5 个以纳秒为单位的数字,您可以使用五个 S 字母而不是六个:
String timeStamp = "2017-07-25 16:19:59.89384";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"); // five "S"
LocalDateTime datetime = LocalDateTime.parse(timeStamp, formatter);
另请注意,LocalDateTime.parse 返回 LocalDateTime(而不是您的代码中的 LocalDate)。
如果您不知道输入中有多少位数,您可以使用 java.time.format.DateTimeFormatterBuilder 和 java.time.temporal.ChronoField 并定义最小和最大位数:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// date / time
.appendPattern("yyyy-MM-dd HH:mm:ss")
// nanoseconds, with minimum 1 and maximum 9 digits and a decimal point
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
// create formatter
.toFormatter();
LocalDateTime datetime = LocalDateTime.parse(timeStamp, formatter);
您只需要根据需要调整值 1 和 9。