Java 为什么SimpleDataFormat不会对无效格式引发异常?

Java 为什么SimpleDataFormat不会对无效格式引发异常?,java,parsing,simpledateformat,Java,Parsing,Simpledateformat,为什么返回Sun Dec 05 00:00:00 GMT 28我期待一个异常。SimpleDataFormat的Javadoc对重复的模式字母有这样的说明: 数字:对于格式化,图案字母的数量是最小位数,较短的数字将被零填充到此数量对于解析,除非需要分隔两个相邻字段,否则忽略模式字母的数量 (强调矿山) 因此,对于解析,“yyyy-MM-dd”相当于“y-M-d” 使用此模式,将“23-06-2015”解析为年=23,月=6,月=2015 默认情况下,从2003年6月1日开始计算2015天,直到2

为什么返回
Sun Dec 05 00:00:00 GMT 28
我期待一个异常。

SimpleDataFormat的Javadoc对重复的模式字母有这样的说明:

数字:对于格式化,图案字母的数量是最小位数,较短的数字将被零填充到此数量对于解析,除非需要分隔两个相邻字段,否则忽略模式字母的数量

(强调矿山)

因此,对于解析,
“yyyy-MM-dd”
相当于
“y-M-d”

使用此模式,
将“23-06-2015”
解析为
年=23,月=6,月=2015

默认情况下,从2003年6月1日开始计算2015天,直到2028年12月5日,即可解决此问题

您可以使用
SimpleDataFormat.setLenient(false)
更改此行为--禁用Lenience后,它将对超出范围的数字引发异常。这在
Calendar.setLenient()中有正确的记录



注意,对于Java8中的新代码,最好避免使用旧的
Date
Calendar
类。如果可以,请使用
LocalDateTime.parse(CharSequence text,DateTimeFormatter formatter)

无法从处于格式化状态的字符串日期获取日期对象。因此,当您尝试格式化日期时,JVM不管您的格式如何,都会给您一个通用日期。请改为:`java.time.format.DateTimeFormatter.ofPattern(“yyyy-MM-dd”).parse(“23-06-2015”);`,如果您使用的是Java8。因为
SimpleDateFormat
就是这样设计的。事实证明,这是一个糟糕的设计决策。如果在解析之前对
SimpleDataFormat
调用
setLenient(false)
,可能会得到预期的异常。但@sndyuk建议的解决方案是:完全跳过
SimpleDateFormat
,使用
DateTimeFormatter
。如果您还没有使用Java 8,可以在新的Java.text.simpleDataFormat(“yyyy-MM-dd”).parse(“23-06-201abc5xyz”)
中找到它。解析也会很好!另外,如果要在
DateFormat
类中读取
parse
方法的JavaDoc,您可以看到下一步:默认情况下,解析是宽松的:如果输入不是此对象的format方法使用的格式,但仍然可以作为日期解析,则解析成功。客户可能会通过致电setLenient(false)来坚持严格遵守该格式。@slim感谢您对DateTimeFormatter的建议
import java.text.ParseException;

public class Hello {

    public static void main(String[] args) throws ParseException {
        System.out.println(new java.text.SimpleDateFormat("yyyy-MM-dd").parse("23-06-2015"));
    }
}