2013-05-15 55 views
2

较早的日期我有解析日期下面的代码:乔达时间:异常解析于1970年的

public Boolean isDate(String date, String dateFormat) { 
     try { 
      DateTimeFormat.forPattern(dateFormat).parseDateTime(date); 

     } catch(Exception e) { 
      return false; 
     } 

     return true; 

    } 

这与最近的日期一样20071001与格式yyyyMMdd效果很好。但是对于早于1970年的日期,如19600101yyyyMMdd的格式相同,该方法返回false。

任何关于如何解决这个问题的想法将非常感激。

UPDATE:

我得到的例外是:

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类方法是我用@Autowired IValidationUtils validationUtils连线的豆子。这不是我正在做的唯一验证。其他验证工作成功了,而且这一点让我得出结论,这个问题与Joda Time有关。

UPDATE(解决方案):

继@ Ettiene的建议(在下面的答案),我得到了解决我的问题。修订后的工作代码是:

public Boolean isDate(String date, String dateFormat) { 
     try { 
      DateTimeFormatter fmt = DateTimeFormat.forPattern(dateFormat); 
      DateTime dt = fmt.withZone(DateTimeZone.UTC).parseDateTime(date); 

     } catch(Exception e) { 
      return false; 
     } 

     return true; 

    } 
+1

这是因为纪元始于1970年1月1日 – 2013-05-15 12:16:46

+0

这是否意味着我不能使用Joda时间来解析日期早于1970年1月? – okello

+2

@hob那么负数不再存在?如果他40岁,我们不能使用程序来注册某人的出生日期? – SJuan76

回答

2

此问题似乎与从冬令时到夏令时的过渡有关。问题在于某些日期在某些时区因过渡而无效。

例如,在法国/巴黎时区,2013-03-31T02:30由于冬令时到夏令时在今天凌晨2:00发生无效,因此在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

指定最简单的方法避免这种情况是个好主意:将格式器的时区设置为UTC。 –

+0

谢谢@Ettienne和Jon。我正在尝试它。 – okello

+0

它的工作原理。感谢负载。 – okello

1

不要使用parseDateTime(),使用parseLocalDate()(可用自2.0)

这是概念上正确的方式(你是不是解析一个日期,但日期),是稳健的(你不需要担心时区,DST转换以及与您的问题完全不同的所有内容)。

此外,您应该只捕获IllegalArgumentException,其他异常应重新抛出或捕捉不同。

+0

这看起来比上面更优雅。我已经测试过了,它可以工作。我解析的所有日期都不包含时间信息。所以,我同意,正如你所解释的那样,'parseDateTime'与我无关。 'parseLocalDate'更具特色。 +1。 – okello