【发布时间】:2015-09-08 14:37:21
【问题描述】:
我试图找到一种优雅的方法来确定日期格式是否满足给定格式列表中的至少一个。具体来说,我必须根据这 3 种格式验证日期:YYYY、YYYY-MM 和 YYYY-MM-dd。
我尝试了在另一个线程中找到的示例,但它不起作用:
private boolean checkDateFormat( String dateString )
{
String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };
boolean isValid = false;
for ( String possibleDateFormat : possibleDateFormats )
{
try
{
SimpleDateFormat simpleDateFormant = new SimpleDateFormat( possibleDateFormat );
simpleDateFormant.setLenient( false );
simpleDateFormant.parse( dateString.trim() );
isValid = true;
}
catch ( ParseException pe )
{
}
}
return isValid;
}
另一种方法是使用正则表达式,但要涵盖所有可能性会相当复杂。
还有一种方法是解析字符串,分别检查年月日。像这样的:
String[] parts = dateString.split("-");
boolean y = validateY(parts[0]);
boolean m = parts.length>1 ? validateM(parts[1]) : true;
boolean d = parts.length>2 ? validateD(parts[2]) : true;
return y && m && d;
但我觉得它不是那么“优雅”。
其他想法?
示例(为什么代码 1 不起作用):
String[] possibleDates = new String[] { "999", "1001", "2001", "1", "123-3", "1234-13", "2015-12-31", "2015-13-31", "2015-12-32", "1-1-1" };
for (String date : possibleDates)
{
System.out.println(date + " : " + checkDateFormat(date));
}
输出(有和没有中断):
999 : true
1001 : true
2001 : true
1 : true
123-3 : true
1234-13 : true <- 13 months??
2015-12-31 : true
2015-13-31 : true <- 13 months??
2015-12-32 : true <- 32 days??
1-1-1 : true
Kartic 代码示例:
String[] possibleDateFormats = new String[] { "yyyy", "yyyy-MM", "yyyy-MM-dd" };
String[] possibleDates = new String[] { "999", "1001", "2001", "1", "123-3", "1234-13", "2015-12-31", "2015-13-31", "2015-12-32", "1-1-1", "0-00-0" };
boolean isDate = false;
for ( String date : possibleDates )
{
for ( String strDate : possibleDateFormats )
{
isDate = isValidDate( date, strDate );
if ( isDate )
{
break;
}
}
System.out.println(date + " :- " + isDate);
}
输出是一样的……
【问题讨论】:
-
在您发布的示例代码中,您为什么要调用 setLenient(false)?我认为这是错误的
-
一个建议,在
isValid = true;之后放一个break; -
你试过Joda Time吗?
-
I tried with an example found in another thread, but it doesn't work- 你能给我们举个例子吗,它在哪里不起作用?
标签: java validation