Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Joda时间:异常分析日期早于1970年_Java_Jodatime - Fatal编程技术网

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;

    }