使用DateFormat解析日期,为什么会有效?

时间:2016-08-02 11:18:43

标签: java date

我有这段代码将一个big-endian-date字符串解析为Date:

public static final Date fromBigEndian(String dateBigEndian) {
    DateFormat bigEndianFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
        return bigEndianFormat.parse(dateBigEndian);
    } catch (ParseException e) {
        return null;
    }
}

和这个测试用例:

@Test
public void returnNullIfDoesNotMatchBigEndianFormat() {
    String nonBigEndianDate = "01-06-2016";
    Date parsedDate = DateUtil.fromBigEndian(nonBigEndianDate);    
    assertNull(parsedDate);
}

但它失败了。它返回的是Date而不是null,但"01-06-2016"的格式与模式"yyyy-MM-dd"不匹配。为什么该方法不会抛出ParseException

1 个答案:

答案 0 :(得分:4)

您应该使用DateFormat.setLenient(false)

public static final Date fromBigEndian(String dateBigEndian) {
    DateFormat bigEndianFormat = new SimpleDateFormat("yyyy-MM-dd");
    bigEndianFormat.setLenient(false);
    try {
        return bigEndianFormat.parse(dateBigEndian);
    } catch (ParseException e) {
        return null;
    }
}

现在它将抛出ParseException

来自official documentation

  

public void setLenient(boolean lenient)

     

指定日期/时间解析是否宽松。同   宽松解析,解析器可以使用启发式来解释输入   与该对象的格式不完全匹配。通过严格的解析,   输入必须与此对象的格式匹配。