在计算1918-03-24之后的天数时,Joda-time一个一个错误

Chr*_*hro 5 java datetime jodatime date-difference java-time

计算使用Joda-Time 之间的天数1900-01-01和日期之间的天数1918-03-24似乎给出了一个一个接一个的结果.

使用Java 8可以java.time得到正确的结果.Joda-Time不计算的原因是什么1918-03-25

使用Joda-time v2.9.9.

public static void main(String[] args) {
    jodaDiff("1918-03-24");
    javaDiff("1918-03-24");
    jodaDiff("1918-03-25");
    javaDiff("1918-03-25");
    jodaDiff("1918-03-26");
    javaDiff("1918-03-26");
    jodaDiff("2017-10-10");
    javaDiff("2017-10-10");
}
private static void jodaDiff(String date) {
    DateTime start = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeZone.forID("UTC"));
    DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd");
    DateTime end = dateDecoder.parseDateTime(date);
    int diff =  Days.daysBetween(start, end).getDays();
    System.out.println("Joda " + date + " " + diff);
}
private static void javaDiff(String date) {
    LocalDate start = LocalDate.parse("1900-01-01");
    LocalDate end = LocalDate.parse(date);
    int diff =  (int) ChronoUnit.DAYS.between(start, end);
    System.out.println("Java " + date + " " + diff + "\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Joda 1918-03-24 6656
Java 1918-03-24 6656

Joda 1918-03-25 6656
Java 1918-03-25 6657

Joda 1918-03-26 6657
Java 1918-03-26 6658

Joda 2017-10-10 43015
Java 2017-10-10 43016

Jon*_*eet 8

问题是您DateTimeFormatter正在使用系统默认时区.理想情况下,您应该解析LocalDate值而不是DateTime,但您可以通过使用UTC格式化器来修复它:

DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd").withZoneUTC();
Run Code Online (Sandbox Code Playgroud)

LocalDate改为解析,只需使用:

org.joda.time.LocalDate start = new org.joda.time.LocalDate(1900, 1, 1);
DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd");        
org.joda.time.LocalDate end = dateDecoder.parseLocalDate(date);
Run Code Online (Sandbox Code Playgroud)

(如果你不使用Java 8,显然你不需要完全限定它.)

  • @Chro:我们不知道你正在使用哪个时区,这没有用 - 但是1918年的英国DST转换是在3月24日,这可能是相关的.如果你要求在1918年12月的日期,两个结果匹配,并在1919年6月他们不再(至少在我的机器上). (2认同)