我有以下用于解析日期的代码:
public Boolean isDate(String date, String dateFormat) {
try {
DateTimeFormat.forPattern(dateFormat).parseDateTime(date);
} catch(Exception e) {
return false;
}
return true;
}
这适用于最近的日期,例如格式为20071001
的{{1}}。但是对于早于1970年的日期,如yyyyMMdd
格式为19600101
,该方法返回false。
关于如何解决这个问题的任何想法都将非常感激。
更新:
我得到的例外是:
yyyyMMdd
这就是我调用方法的方法:
Cannot parse "19400101": Illegal instant due to time zone offset transition (Africa/Nairobi)
包含if(validationUtils.isDate(propVal, dateFormat) == false) {
String msg = "Not a valid DATE";
Quartet<String, String, String, String> t = new Quartet<String, String, String, String>(recNo, field, propVal, msg);
errors.add(t);
}
方法的类是我使用isDate
连接的bean。这不是我正在做的唯一验证。其他验证的东西也成功了,这一点让我得出结论,这个问题与Joda Time有关。
更新(解决方案):
按照@Ettiene的建议(在下面的答案中),我找到了解决问题的方法。修改后的工作代码是:
@Autowired IValidationUtils validationUtils
答案 0 :(得分:2)
这个问题似乎与从冬季到夏季的过渡有关。问题是由于过渡,某些日期在某些时区无效。
例如,在法国/巴黎时区,2013-03-31T02:30无效,因为从冬令时到夏令时的切换发生在当天凌晨2点,因此在2013-03-31T01:59之后的分钟是2013-03-31T03:00
我想在你的时区,okello,在1970年之前,过渡发生在1月1日午夜。因此,1960-01-01T00:00无效(但1959-12-31T00:00和1960-01-02T00:00有效)。
请记住,当未指定一天中的小时时,假设是午夜。
答案 1 :(得分:1)
请勿使用parseDateTime()
,请使用parseLocalDate()
(自2.0开始提供)
这是概念上正确的方法(你没有解析日期时间而是日期)并且很健壮(你不需要担心时区,DST转换以及与你的问题完全不同的所有东西)。
此外,您应该只捕获IllegalArgumentException
,其他例外应该被重新抛出或以不同方式捕获。