我收到一个表示日期的字符串,我需要将此字符串转换为日期,并验证字符串是否为有效日期。
我收到字符串33-12-2013一个解析方法返回日期01-01-2014,代码:
Date fechaVencimientoFormateada;
SimpleDateFormat formateador = new SimpleDateFormat( "dd-MM-yyyy" );
try
{
fechaVencimientoFormateada = formateador.parse( "33-12-2013" );
System.out.println( formateador.format(fechaVencimientoFormateada) );
}
catch ( ParseException e )
{
System.out.println("ERROR!");
}
输出: 2014年1月2日00:00:00 COT 2014
我期待ParseException,任何想法?
其他例子:
字符串日期:365-12-2013 输出:2014年11月30日00:00:00 COT 2014
字符串日期:1-24-2013 输出:2014年12月1日00:00:00 COT 2014
为什么ParseException没有抛出?
答案 0 :(得分:10)
确保setLenient(false)
上的SimpleDateFormat
。否则它会毫无例外地解析许多无效日期,你不能过多地信任输出。
答案 1 :(得分:1)
解析器将尝试尽可能地解析您的输入,除非您将其lenient
标志定义为 false ,在这种情况下,解析器将严格遵循您提供的模式。默认情况下(在您的情况下)此标志设置为 true ,这意味着输入中的任何不连贯将尝试抢救,如果您不太清楚它会导致意外输出工作
“尽我所能”,我的意思是:
通过宽松解析,解析器可以使用启发式方法来解释与该对象的格式不完全匹配的输入。
让我们来看看你的例子:
字符串日期:365-12-2013输出:Sun Nov 30 00:00:00 COT 2014
最大允许天数,月份或年份之间的超出差距将以超出的特定单位添加。在这种情况下,你可以到12月31日,因为“溢出”的字段是一天。您将有31天的时间设置,334还剩下去,这仍将作为天数添加。
长话短说:December 31, 2013
到来后{334}天November 30, 2014
。
字符串日期:1-24-2013输出:2014年12月1日00:00:00 COT 2014
在这种情况下,原则是相同的,但它适用于几个月。在这种情况下,可能的最大月份是12,因此,还剩12个月,您实际上是在您的日期添加一年。导致您收到的输出。
将lenient
标志设置为 false 将强制严格遵守模式,并且会正确抛出您寻求的异常。