2016-08-02 41 views
2

我有这样的代码来解析大端-日期字符串到日期:使用DateFormat解析日期,它为什么会起作用?

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); 
} 

但它失败。它返回一个日期而不是null,但"01-06-2016"的格式与"yyyy-MM-dd"的格式不匹配。为什么这种方法不会抛出ParseException

+1

'Date'对象包含什么? –

+1

请注意'DateFormat.parse()'的javadoc:source - 应该解析其**开头**的字符串。 ... ParseException - 如果指定字符串的**开头**不能被解析。 –

+0

@krzyk [demo](http://ideone.com/7fZ00p)。这很奇怪 – BackSlash

回答

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

公共无效setLenient(布尔宽松)

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

+0

是的,它现在有效。谢谢!我会在5分钟内接受。 –

相关问题