Joda Time:异常解析日期早于1970年

时间:2013-05-15 12:14:56

标签: java jodatime

我有以下用于解析日期的代码:

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

2 个答案:

答案 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,其他例外应该被重新抛出或以不同方式捕获。