Java Joda时间:异常分析日期早于1970年
我有以下解析日期的代码:Java Joda时间:异常分析日期早于1970年,java,jodatime,Java,Jodatime,我有以下解析日期的代码: public Boolean isDate(String date, String dateFormat) { try { DateTimeFormat.forPattern(dateFormat).parseDateTime(date); } catch(Exception e) { return false; } return true; }
public Boolean isDate(String date, String dateFormat) {
try {
DateTimeFormat.forPattern(dateFormat).parseDateTime(date);
} catch(Exception e) {
return false;
}
return true;
}
这适用于较新的日期,如格式为yyyyMMdd
的20071001
。但是,对于1970年之前的日期,如格式相同的yyyyMMdd
的19600101
,该方法返回false
任何关于我如何解决这个问题的想法都将不胜感激
更新:
我得到的例外是:
无法解析“19400101”:由于时区偏移转换(非洲/内罗毕)导致的非法瞬间
这就是我调用方法的方式:
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);
}
这个问题似乎与从冬季到夏季的过渡有关。问题是,由于转换,某些日期在某些时区无效
例如,在法国/巴黎时区,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有效)
请记住,如果未指定一天中的小时数,则假定为午夜。不要使用parseDateTime()
,请使用(从2.0开始提供)
这是概念上正确的方法(您不是在解析日期时间,而是在解析日期),而且非常健壮(您不需要担心时区、DST转换以及所有与您的问题完全无关的东西)
此外,您应该只捕获IllegalArgumentException
,其他异常应该重新捕获或以不同的方式捕获。这是因为历元从1970年1月1日开始,这是否意味着我不能使用Joda时间解析1970年1月1日之前的日期?@hob所以负数不再存在?如果某人已经40岁了,我们就不能用程序来登记他的出生日期了?可能有一个解决办法,我会考虑一下,你可能必须使用朱利安日期而不是乔达日期,尽管它对我来说绝对适用于DateTimeFormat.forPattern(“yyyyMMdd”).parseDateTime(“19600101”)
。请制作一个简短但完整的程序来演示此问题。最好指定避免此问题的最简单方法:将格式化程序的时区设置为UTC。这看起来比上面的方法更优雅。我已经测试过了,效果很好。我正在解析的只是不包含时间信息的日期。所以,正如你所解释的,我同意,parseDateTime
与我无关parseLocalDate
更准确+1.
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;
}