我对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(..)
从未被调用过一样?
故意在方法中留下一些调试代码
在方法调用期间没有抛出异常,我传入有效数据!
答案 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);