我正在尝试创建一些可以检查多种格式的日期/时间的内容,以查看它是否是一个有效的日期/时间,以便我可以处理它。处理它包括将日期/时间转换为我的软件可以使用的规范化的内容。问题是我必须以不同的方式检查以尝试使用SimpleDateFormat检测日期,但实际上很难得到各种各样的。该项目与在日期列中使用用户指定的日期格式解析CSV文件有关。有没有更好的办法?这就是我现在正在做的事情:
public static boolean isDateValid(String dateString)
{
ArrayList<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();
dateFormats.add(new SimpleDateFormat("M/dd/yyyy"));
dateFormats.add(new SimpleDateFormat("dd.M.yyyy"));
dateFormats.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss"));
dateFormats.add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss"));
dateFormats.add(new SimpleDateFormat("dd-M-yyyy hh:mm:ss"));
dateFormats.add(new SimpleDateFormat("M-dd-yyyy hh:mm:ss"));
dateFormats.add(new SimpleDateFormat("yyyy-M-dd hh:mm:ss"));
dateFormats.add(new SimpleDateFormat("dd.MMM.yyyy"));
dateFormats.add(new SimpleDateFormat("dd-MMM-yyyy"));
dateFormats.add(new SimpleDateFormat("M/dd"));
dateFormats.add(new SimpleDateFormat("M dd"));
dateFormats.add(new SimpleDateFormat("M y"));
for (SimpleDateFormat format : dateFormats)
{
try
{
format.setLenient(false);
Date date = format.parse(dateString);
return true;
}
catch (Exception e)
{
}
}
return false;
}
另外我也尝试过使用apache commons中的DateUtils,但似乎我仍然需要循环一堆日期。
public static boolean isDate(String dateString)
{
try
{
Date theDate = DateUtils.parseDate(dateString);
}
catch (Exception e)
{
System.out.println(e);
return false;
}
return true;
}
任何鼓励的想法或话语?
答案 0 :(得分:0)
您当前的方法存在的一个问题是,当您知道只使用SimpleDateFormat时,就会不必要地创建所有SimpleDateFormat实例。相反,使用正则表达式来检测您正在接收的日期字符串类型,然后执行以下两项操作之一:1)仅实例化您需要的格式化程序,或者2)将字符串操作为标准格式,您可以使用一种格式解析普通格式化程序。
答案 1 :(得分:0)
嗯,这是我的建议:
您应该缩小支持日期格式的类型。它是 creazy支持各种日期格式,例如,一九九零年三月一日 是中文的有效日期格式。
我们有一个双重检查方法来检测有效日期为 以下内容:
public boolean isDate(String dateStr, DateFormat format){
boolean result = false;
try
{
Date date = format.parse(dateStr);
if (format.format(date).equals(dateStr))
{
result = true;
}
} catch (Exception e)
{
result = false;
}
return result;
}
因为“2013/4/31”由SimpleDateFormat转换为“2013/5/1”,4月的最后一次是30日,对吗?
答案 2 :(得分:0)
我在工作中被分配了一个类似的问题,我参与了一个ETL过程,将数据从源文件加载到仓库。日期格式因源提供商而异。
我的解决方案是列出的循环示例。可以选择使用parsePosition而不是循环。
但是,有一些方法可以使循环代码更好地再次实例化SimpleDateFormat(已经发布)。相反,只需使用applyPattern
即可。
此外,将各种格式保存在平面文件(config)中将使配置和适应新格式变得更好。
我已在以下link发布了我的实施。它可能会有所帮助。