2012-06-21 148 views
2

使用SimpleDateFormat.parse(String)要求格式中指定的所有字段都存在于输入字符串中。我想要的是用相同的格式验证部分输入字符串的方法。Java解析部分日期

例如,Format="yyyy/MM/dd HH:mm:ss"Input="2012/01/01"应该匹配,并且一天中的时间应设置为零。

有没有办法做到这一点?目前,SimpleDateFormat引发异常。

+0

'SimpleDateFormat'不是'final'类,你可以扩展它(或可能'DateFormat')。我相当肯定,没有建立在这种方式下的行为;你将自己写下差异。尽管如果某人只提供'01',会发生什么情况 - 他们的意思是1月份,(假定当前)月份的第一天,1:00:00还是其他什么?格式化程序基本上提供了有关如何解释字符串的说明... –

+0

另一种方法是从fullformat开始,然后使用substring()删除最后一个字符并创建新格式,直到找到格式火柴。那种残酷,但非常有效。 –

回答

2

使用2个不同的SimpleDateFormat对象,每个对象具有不同的日期格式,并使用第一个。如果引发解析异常,请使用另一个。

最佳解决方案恕我直言,你首先使用正则表达式检查字符串,以便知道使用哪种解析格式。也可能你想在正则表达式中使用分组并自己形成日期(例如使用Calendar),而不是至少两次解析字符串(一个是正则表达式,其次是DateFormat)。

+1

我更喜欢正则表达式。也想到了例外情况,但试图想到一个不依赖于例外的干净解决方案。 – Windle

0

这里是落实m0skit0提出的解决方案的方式,使用多个SimpleDateFormat可以级联与尝试捕捉的解析,对于如:

SimpleDateFormat fullFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
SimpleDateFormat shortFormat = new SimpleDateFormat("yyyy/MM/dd"); 

String input="2012/01/01"; 
Date res; 
try { 
    res = fullFormat.parse(input); 
} catch (ParseException e) { 
    res = shortFormat.parse(input); 
} 
+1

将复制粘贴问题与您的'shortFormat' =) – Windle

+0

我已在15分钟前提供此答案。在回答之前请阅读现有答案。 – m0skit0

+0

Thx to @Windle,我改正了。 ;) – Nicocube