gpt4 book ai didi

java - 计算 1918-03-24 之后的天数时,Joda 时间差一错误

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:57 25 4
gpt4 key购买 nike

使用 Joda-Time 计算 1900-01-011918-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");
}

输出:

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

最佳答案

问题是您的 DateTimeFormatter 使用的是系统默认时区。理想情况下,您应该解析为 LocalDate 值而不是 DateTime,但无论如何您都可以通过为格式化程序使用 UTC 来修复它:

DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-dd").withZoneUTC();

要改为使用 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);

(显然,如果您不使用 Java 8,则不需要完全限定它。)

关于java - 计算 1918-03-24 之后的天数时,Joda 时间差一错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com