3

我正在使用最新版本 2.2 在 java 中尝试 Joda time 我写了一个小片段这是我的代码

public static void main(String[] args) 
{
    BoilerTester clazz = new BoilerTester();
    Calendar today = Calendar.getInstance();
    Calendar born  = Calendar.getInstance();
    //when returns 0 is 10363 when returning 1 = 10362 just a millisecond what have to do with days??
    System.out.println(Math.abs(today.getTimeInMillis()-born.getTimeInMillis()));
    born.set(1984,10,20);        
    clazz.compute(born,today);
}   
private void compute(Calendar born, Calendar today)
{
    System.out.println("JODA:  " + org.joda.time.Days.daysBetween(new org.joda.time.DateTime(born.getTime()),new org.joda.time.DateTime(today.getTime())).getDays());    
}

当我运行源代码时,我得到了这个值

乔达:10363

后来我运行相同的代码,我得到了

乔达:10362

是的,我可能已经运行了 2 到 3 次相同的代码来获得不同的值,但为什么会这样???

多谢。

4

3 回答 3

2

我的猜测是,有时todayborn日期在完全相同的毫秒上,有时它们相差几毫秒(第一次调用Calendar.getInstance()和第二次调用之间经过的时间)。由于 getDays() 返回完整天数,因此几毫秒可能会有所不同。

于 2013-04-05T16:25:19.440 回答
1

我正在写我的答案,但 JB Nizet 更快(他对正在发生的事情绝对正确)。如果你想摆脱这类问题,你应该在 joda-time 中利用partial的概念:

Joda-Time 中的部分是部分日期和时间表示。所有实现都代表本地日期和时间,并且不引用时区。因此,它们仅部分表示日期时间连续体中的日期或时间。

例如,使用LocalDate

LocalDate born = new LocalDate(1984, 11, 20); // BE CAREFUL!: months in JDK are 0-11, but in Joda-Time are 1-12
System.out.println(Days.daysBetween(born, LocalDate.now()).getDays());

使用这种“部分”表示,您不会在内部使用小时、分钟、秒或毫秒,因此您不会因为毫秒而面临这个问题。

于 2013-04-05T16:44:12.173 回答
0

您正在运行 JDK 和 Joda 的混合 - 不要那样做 - Joda完全替换了 JDK 时间类。

于 2013-04-05T16:18:31.867 回答