2013-02-12 45 views
3

我有下面的代码片段SimpleDateFormat的查询

Date date=null; 
    SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); 
    try { 
     date= sdf.parse("2001-02-2012"); 
     System.out.println(date); 
    } catch (ParseException ex) { 
     ex.printStackTrace(); 
    } 

奇怪的是它不抛出解析异常,不应该吗?

+0

这是'java.text.SimpleDateFormat'吗?它没有1参数'parse'功能。 – poitroae 2013-02-12 09:45:17

+1

@poitroae:是的 - 从DateFormat继承。 – 2013-02-12 09:45:51

+1

尝试'sdf.setLenient(false);' - [see](http://stackoverflow.com/q/14786257/1037210)。 – Lion 2013-02-12 09:56:52

回答

3

问题是你的输入是种类的意外。 SimpleDateFormat然后尝试以一种有用的方式解释它。因此,在你的情况下,有2001天,只是简单地转换为几周,几个月和几年。你的日期是Mon Jul 24 00:00:00 GMT 2017。您可以在ideone上查看:http://ideone.com/bfgogz

要“修复”它,您可以添加sdf.setLenient(false);以仅接受与您指定的输入完全相同的输入。

2

Acc。到文档:

public Date parse(String source) throws ParseException 

从给定字符串的开始解析文本,以生成一个日期。 该方法可能不会使用给定字符串的整个文本。

抛出ParseException - 如果开始指定字符串的无法解析。

参见:DateFormat

+0

这是对的,但它与问题无关。 – poitroae 2013-02-12 11:12:55

2

这会让ParseException如果你分析它不从宽。 DateFormat#setLenient(false)它也知道严格解析

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

Documentation -

SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); 
sdf.setLenient(false); 
try{ 
    date = sdf.parse("2001-02-2012"); 
    System.out.println(date); 
} catch (ParseException ex) { 
    ex.printStackTrace(); 
} 

结果 -

java.text.ParseException: Unparseable date: "2001-02-2012" 

注:默认情况下Dateformat/SimpleDateFormat解析从轻。