java-8 - 无法使用 DateTimeFormatter 解析日期
问题描述
我正在尝试使用 DateTimeFormatter 解析从 DB 返回给我的日期字符串到 LocalDate。我收到以下异常。
String date = "2018-05-16 03:39:13.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime localDate= LocalDateTime.parse(date , formatter);
java.time.format.DateTimeParseException: Text '2018-05-16 03:39:13.0' could not be parsed at index 20
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) [rt.jar:1.8.0_171]
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) [rt.jar:1.8.0_171]
at java.time.LocalDateTime.parse(LocalDateTime.java:492) [rt.jar:1.8.0_171]
但是下面的代码正在工作。
String date = "2018-05-16 03:39:13.0";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date newDate= formatter.parse(date);
解决方案
由于您使用的是固定长度为 3 的小数秒,因此不能仅用一位数字进行解析。更好地使用 aDateTimeFormatterBuilder
并实现可变的秒数。
String date = "2018-05-16 03:39:13.0";
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
.toFormatter();
LocalDateTime localDate = LocalDateTime.parse(date, formatter);
System.out.println(formatter.format(localDate));
也可以通过使用可选字段来获得可变的秒长度:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSS][.SS][.S]");
推荐阅读
- sockets - 是否可以使用 IFTTT (WebHooks) 从 Raspberry Pi Google Assistant 向套接字 (http://192.168.XX:8000) 发出 Web 请求?
- java - 使用相同的正则表达式时,Python 和 Java 正则表达式的行为不同
- neo4j - 如何计算 Neo4j 中浮点值的排名?
- javascript - 使用 Promise 中的值的异步函数
- matlab - 如何 cd 名称中包含日期的文件
- webpack - 为什么在 Node 中使用 UMD 时需要设置 global.window?
- css - 如何使用 Bootstrap Media 对象在第二行制作省略号媒体标题
- html - 为什么我的 html 表单的密码输入字段有浅蓝色背景?
- ruby-on-rails - 来自 Rails API 调用的奇怪响应
- c# - 开发 azure 函数时有没有办法监视文件更改?