跳过SimpleDateFormat :: parse()

时间:2015-12-07 22:25:57

标签: java android

我对Java / Android开发并不熟悉。 我试图编写一个简单的Android应用程序,作为其中的一部分,我需要将日期从字符串转换为日期。

我有以下方法:

private Date convertFromString(String birthdate) {
        String regex = "^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$\n";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(birthdate);
        Date date = null;
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);

        if (matcher.matches()) {
            try {
                Calendar cal = Calendar.getInstance(); // <-- this,
                cal.setTime(format.parse(birthdate)); // and that line gets skipped by debugger step
                System.out.print(cal); // this line gets executed
            } catch (ParseException exception) {
                System.out.print("wtf??");
            }
        }
        return date;
    }

无论传递给方法的字符串值如何,它总是返回null。当我通过上面标记的调试器行执行此代码时,调试器会跳过它,并且它不会让我介入,好像format.parse(..)从未被调用过一样?

故意在方法中留下一些调试代码

在方法调用期间没有抛出异常,我传入有效数据!

1 个答案:

答案 0 :(得分:1)

1)您根本不是填写日期:

Calendar cal = Calendar.getInstance(); // <-- this,
                cal.setTime(format.parse(birthdate)); // and that line gets skipped by debugger step
                System.out.print(cal);

您设置了cal,但没有设置日期

2)我用“24/11/1980”调用此方法,matcher.matches()返回false,看起来像if(matcher.matches())中的问题,但是调试器显示错误的行。在我将“if(matcher.matches())”更改为“if(true)”之后,此方法将打印“java.util.GregorianCalendar [time = 343868400000,...”。为什么你不使用:

      private Date convertFromString(String birthdate) {
            Date date = null;
           SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);

            try {
                Calendar cal = Calendar.getInstance(); // <-- this,
                cal.setTime(format.parse(birthdate)); // and that line gets skipped by debugger step
                System.out.print(cal); // this line gets executed
                return cal.getTime();   
            } catch (ParseException exception) {
                System.out.print("wtf??");
            }
        return null;
   }

如果你需要一些验证,那么很容易使用reg insead的reg模式,例如:

             cal.before(new Date());
             Calendar beforeHundreadYears = Calendar.getInstance();
             beforeHundreadYears.set(1915, 0, 0);
             cal.after(beforeHundreadYears);