2

如何区分数据输入是(a)无效日期还是(b)无效格式?

我有以下代码用于处理来自文本文件的日期输入。

    public boolean dateIsValid(String date) {
        DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");          
        formatter.setLenient(false);
            try {
                Date dateParsed = (Date) formatter.parse(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return false;

        }

我的一切都按我的意愿工作。我唯一的问题是我无法区分抛出的不同解析异常。例如:

如果字符串日期 = 18/10/2012 -->java.text.ParseException: Unparseable date: "18/10/2012"
如果字符串日期 = 2-12-2001 -->java.text.ParseException: Unparseable date: "2-12-2001"

如您所见,两种错误的格式都会引发相同的错误。我怎样才能区分它们以便我可以以不同的方式处理它们?

编辑

更准确地说,在日期 18/10/2012 的情况下,我应该抛出一个无效的日期错误,而在日期 2-12-2001 的情况下,我需要抛出一个无效的格式异常。我不需要处理不同的格式。我只需要一种为这两种不同情况获取不同异常的方法。

4

3 回答 3

2

问题似乎在这一行

DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");  

对于第一个错误,看起来日期先到后一个月,所以应该像

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

第二个错误显示提供的日期格式不正确,因为它包含-而您期望包含的格式,/例如

DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

如果您想处理不同的格式,请尝试这样:

String[] formatDates= {"MM/DD/yyyy", "dd/MM/yyyy", "MM-dd-yyyy","dd-MM-yyyy"};

Date tryParse(String dateString)
{
    for (String formatDate: formatDates)
    {
        try
        {
            return new SimpleDateFormat(formatDate).parse(dateString);
        }
        catch (ParseException e) {}
    }

    return null;
}
于 2014-09-09T19:13:51.867 回答
2

除非您自己编写代码来解析日期字符串,否则您不会知道格式为什么会引发异常。

我推荐上述 RT 答案的变体。具体来说,不是每次都创建一个新的格式化程序,而是在启动时(在构造函数或静态块中)创建四个(在该示例中)格式化程序。

于 2014-09-09T19:26:07.630 回答
1

我会用

public Date dateIfValid(String format, String date) {
    DateFormat formatter = new SimpleDateFormat(format);          
    formatter.setLenient(false);
        try {
            return dateParsed = (Date) formatter.parse(date);
        } catch (ParseException e) {
            return null;
        }
}

Date mmddyy = dateIfavlid("MM/dd/yy", date.replace("[^0-9]", "/"));
Date ddmmyy = dateIfavlid("dd/MM/yy", date.replace("[^0-9]", "/"));

if (mmddyy != null && ddmmyy == null) {

注意:这可用于检测模棱两可的日期,例如 01/02/03,可能是 2001 年 2 月 3 日

于 2014-09-09T19:16:00.863 回答