【发布时间】:2018-06-07 17:09:57
【问题描述】:
我发现SimpleDateFormat::parse(String source) 的行为(不幸的是)默认设置为宽松:setLenient(true)。
默认情况下,解析是宽松的:如果输入不是该对象的格式方法使用的格式,但仍然可以解析为日期,则解析成功。
如果我将 leniency 设置为 false,文档说通过严格解析,输入必须匹配此对象的格式。我在没有宽松模式的情况下使用了与SimpleDateFormat 配对,并且错误地,我在日期中有错字(字母o 而不是数字0)。 (这是简短的工作代码:)
// PASSED (year 199)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.mm.yyyy");
System.out.println(simpleDateFormat.parse("03.12.199o"));
simpleDateFormat.setLenient(false);
System.out.println(simpleDateFormat.parse("03.12.199o")); //WTF?
令我惊讶的是,这已经过去了,没有ParseException 被抛出。我会更进一步:
// PASSED (year 1990)
String string = "just a String to mess with SimpleDateFormat";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.mm.yyyy");
System.out.println(simpleDateFormat.parse("03.12.1990" + string));
simpleDateFormat.setLenient(false);
System.out.println(simpleDateFormat.parse("03.12.1990" + string));
我们继续吧:
// FAILED on the 2nd line
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.mm.yyyy");
System.out.println(simpleDateFormat.parse("o3.12.1990"));
simpleDateFormat.setLenient(false);
System.out.println(simpleDateFormat.parse("o3.12.1990"));
最后抛出异常:Unparseable date: "o3.12.1990"。我想知道宽大处理的区别在哪里,为什么我的第一个代码 sn-p 的最后一行没有引发异常?文档说:
通过严格解析,输入必须匹配此对象的格式。
我的输入显然与格式不匹配严格 - 我希望这种解析非常严格。为什么会(不)发生这种情况?
【问题讨论】:
-
您当然可以改用
LocalDate date = LocalDate.parse("03.12.199o", DateTimeFormatter.ofPattern("dd.MM.yyyy"));,这将对整个字符串表现出您似乎想要的严格行为。请注意,在 SimpleDateFormat 和 DateTimeFormatter 中,日期格式中的mm是分钟,而不是月;你的意思可能是MM。
标签: java date parsing string-formatting simpledateformat