使用SimpleDateFormat.parse(String)
要求格式中指定的所有字段都存在于输入字符串中。我想要的是用相同的格式验证部分输入字符串的方法。Java解析部分日期
例如,Format="yyyy/MM/dd HH:mm:ss"
和Input="2012/01/01"
应该匹配,并且一天中的时间应设置为零。
有没有办法做到这一点?目前,SimpleDateFormat
引发异常。
使用SimpleDateFormat.parse(String)
要求格式中指定的所有字段都存在于输入字符串中。我想要的是用相同的格式验证部分输入字符串的方法。Java解析部分日期
例如,Format="yyyy/MM/dd HH:mm:ss"
和Input="2012/01/01"
应该匹配,并且一天中的时间应设置为零。
有没有办法做到这一点?目前,SimpleDateFormat
引发异常。
使用2个不同的SimpleDateFormat
对象,每个对象具有不同的日期格式,并使用第一个。如果引发解析异常,请使用另一个。
最佳解决方案恕我直言,你首先使用正则表达式检查字符串,以便知道使用哪种解析格式。也可能你想在正则表达式中使用分组并自己形成日期(例如使用Calendar
),而不是至少两次解析字符串(一个是正则表达式,其次是DateFormat
)。
我更喜欢正则表达式。也想到了例外情况,但试图想到一个不依赖于例外的干净解决方案。 – Windle
尝试Apache Utils的DateUtils#parseDate(String, String[])
。 它可以让你传递一个允许的格式数组,并会尝试每一个,直到适合。
这里是落实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);
}
'SimpleDateFormat'不是'final'类,你可以扩展它(或可能'DateFormat')。我相当肯定,没有建立在这种方式下的行为;你将自己写下差异。尽管如果某人只提供'01',会发生什么情况 - 他们的意思是1月份,(假定当前)月份的第一天,1:00:00还是其他什么?格式化程序基本上提供了有关如何解释字符串的说明... –
另一种方法是从fullformat开始,然后使用substring()删除最后一个字符并创建新格式,直到找到格式火柴。那种残酷,但非常有效。 –