计算1918-03-24之后的天数时,乔达(Joda)时间一一错误

色度

计算使用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");
}

输出:

乔达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

乔达2017-10-10 43015
Java 2017-10-10 43016

乔恩·斯基特(Jon Skeet):

问题是您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,则不需要完全限定它。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

计算乔达时间中的日期差时,应显示天数而不是星期数

在跳过假期+乔达时间的同时计算结束日期

2个日期与Joda时间之间的差值天数计算错误?

root :0 2018-03-03 12:24(:0)..来自哪里?

如何將“['2022-03-24','2022-03-25']”轉換為javascript數組

乔达(Joda)时间,以毫秒为单位

乔达时间-计算两个日期之间的秒数会引发异常。

乔达时间:计算到下一个完整间隔的时间(以月为单位)

乔达(Joda)时间更改日期调整时的UTC偏移量

Range.Autofilter 给出错误 800A03EC

输出错误为 0x03BB7390

在编译时获取最大sizeof c++03

乔达时间plusDays错误的日期

乔达时间给出了错误的时区

约旦的乔达时间夏令时

Python MySQLdb错误的日期时间值:'2018-03-25 02:00:02'

php date函数在2017-03-22时间戳出错

乔达时间IllegalArgumentException

添加乔达时间

计算日期时间之间的天数

如何将日期时间列标题(例如 2007-03-01 00:00:00)转换为日期-月-年格式,即 2007-03-01

有一个包含 "(UTC-03:00) - Santiago" 的字符串字段需要提取时间 -03:00 并在 BigQuery 中转换为秒

在本地计算机上克隆JUnit 5之后,在执行“汇编”任务时编译时间错误

杰克在预览版4上失败,并出现com / android / jack / api / v03 / Api03Config错误

Laravel SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:'updated_at'列的'2019-03-10 02:00:39'(夏令时?)

将Oracle to_date('24 -03-20','DD-MM-RR')转换为雪花

SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:'2019-03-31 01:52:25'

乔达时间和Java8时差

如何解析“ 2019-09-19 04:03:01.770080087 +0000 UTC”时间戳