我在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());
}
}
答案 0 :(得分:3)
首先,主要问题:您在new Date()
和Calendar.getInstance()
中两次询问Java的“当前日期时间”,并且您无法确定这两个调用是否会返回完全相同的瞬间或者如果他们可以在几毫秒内有所不同。
此外,由于您使用DateTime
而不是LocalDate
,因此几毫秒的差异可能会改变已用天数的计算。如果你(在概念上)处理天之间的差异并且你不关心时间(h:m:s.sss),也许你应该更好地使用LocalDate
。
第一个问题可以通过只询问一次Java当前datime来解决:
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
。