如何解决DateTimeFormatter的日期格式问题
我的日期格式如下:1/1/2020 3:4:7 AM
我正在尝试使用DateTimeFormatter
格式化日期。
LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM",DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));
我收到以下异常:
java.time.format.DateTimeParseException: Text '1/1/2020 3:4:7 AM' Could not be parsed at index 0
有人可以帮助我吗?
解决方法
两个独立的问题:
计数错误
您正在使用例如MM
是明确的:始终为全数字,零填充。您的字符串不是那样,而只是数字。因此,将其设为M/d/uuuu h:m:s a
。
编辑:感谢@deHaar,将yyyy
更改为uuuu
。推论:yyyy或uuuu无关紧要,但是请注意,这表示必填4个数字。差异会在0之前的几年内开始出现:uuuu
变为负数,yyyy
不会,并且期望您使用例如GG
,以便您获得44 BC
而不是-44
。这样一来uuuu
就更正确了,尽管通常不会出现差异。
缺少语言环境
第二个问题是您应该切勿使用此版本的ofPattern
-它有一个bug,您无法在单元测试中找到它,因此该bug这是“较重”的数千倍,因此是一个真正的问题。
您需要指定语言环境。没有它,除非您的平台默认语言环境为英语,否则“ AM”将无法解析。
放在一起
LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM",DateTimeFormatter.ofPattern("M/d/uuuu h:m:s a",Locale.ENGLISH));
效果很好。
,-
使用单个字母表示日期和时间(月,日,年,小时,分钟和秒)。
-
您还可以使格式设置程序以不区分大小写的方式(例如am,AM,Am)处理模式,如下所示:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; public class Main { public static void main(String[] args) { // Formatter to handle the pattern in case insensitive way (e.g. am,AM,Am) DateTimeFormatter formatter = new DateTimeFormatterBuilder() .parseCaseInsensitive() .appendPattern("M/d/u h:m:s a") .toFormatter(Locale.ENGLISH); LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM",formatter); System.out.println(date); } }
输出:
2020-01-01T03:04:07
,
在您的代码段中:
LocalDateTime
.parse("1/1/2020 3:4:7 AM",DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));
-
1
-与MM
不匹配 -
1
-与dd
不匹配 -
3
-与hh
不匹配 -
4
-与mm
不匹配 -
7
-与ss
不匹配
即格式化程序模式部分(例如MM
)的长度与它们来自字符串文本(例如1
)的各个部分的长度不匹配。
您可以通过几种方式来匹配它们,例如您可以更改字符串文本以匹配格式化程序模式,也可以采用其他方法。
您可以尝试以下方法:
LocalDateTime
.parse("01/01/2020 03:04:07 AM",DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));
另外,看看Pattern Letters and Symbols。
,根据documentation of DateTimeFormatter:
数字:如果字母数为一个,则使用最小位数输出该值,并且不带填充。否则,将数字的位数用作输出字段的宽度,并在必要时将值补零。
通过反转推理,您可以尝试使用此格式化程序:
DateTimeFormatter.ofPattern("M/d/yyyy h:m:s a")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。