【问题标题】:Joda Time - inconsistent resultJoda Time - 结果不一致
【发布时间】:2012-01-03 10:58:38
【问题描述】:

我对 Joda-Time 库中的 daysBetween 函数进行了快速测试,但结果不一致。其他人有同样的问题吗?

下面是我用来测试的代码。

public static int elapsedDaysJoda() {
    DateTime dt1 = new DateTime(new Date());        
    Calendar cal = Calendar.getInstance();
    cal.set(2011, 0, 1); 
    DateTime dt2 = new DateTime(cal.getTime());
    Days days = Days.daysBetween(dt2, dt1);
    return days.getDays();
}

public static void main(String[] args) {
    for(int i=0; i < 10; i++) {
        System.out.println(elapsedDaysJoda());
    }
}

【问题讨论】:

    标签: jodatime


    【解决方案1】:

    首先,也是主要问题:您在new Date()Calendar.getInstance() 中两次向Java 询问“当前日期时间”,并且您不能确定这两个调用是否会返回完全相同的瞬间,或者是否可以相差几毫秒。

    此外,由于您使用的是DateTime 而不是LocalDate,因此几毫秒的差异可能会改变经过天数的计算。如果您(从概念上)处理日期之间的差异并且您不关心时间(h:m:s.sss),那么您最好使用LocalDate

    第一个问题可以通过只询问 Java 当前日期一次来解决:

    public static int elapsedDaysJoda() {
        Calendar cal = Calendar.getInstance();
        DateTime dt1 = new DateTime(cal);
        cal.set(2011, 0, 1); 
        DateTime dt2 = new DateTime(cal.getTime());
        Days days = Days.daysBetween(dt2, dt1);
        return days.getDays();
    }
    

    此外(或者,这也修复了不一致的结果),您可以使用LocalDate 而不是DateTime

    【讨论】:

    • 感谢您的清晰解释。 LocalDate 是我需要的。
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2020-07-08
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多