计算Java中两个日期或日历对象之间的日期

问题描述:

因此,对于任务,我们必须使用JDK Date或Calendar对象来表示我们正在设计的系统中的日期(否则我将使用另一个库)。对于一个函数,我需要确保从输入日期到目前的日期至少已过去了若干年。我写了下面的方法,以两个日历对象之间尝试并计算天数:计算Java中两个日期或日历对象之间的日期

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 

    int daysSince = 0; 

    while (pastDate.before(presentDate)) { 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } return daysSince; 
} 

但是,这种方法似乎总是恰好返回比两个日期之间的实际的天数少30天,我可以” t似乎弄清楚为什么?例如,它表示2016年3月25日至2016年4月25日期间只有一天。我错过了什么?

+0

看到这个http://*.com/questions/1555262/calculating-the-difference-between-two-java-date-instances –

你的代码工作主要是(proof)。我怀疑你的测试数据有什么问题。

例如,它表示2016/3/25和2016/4/25之间只有一天。

我怀疑你创建测试日期(3/25/2016)不正确。请记住,MONTH值开始,所以要创建2016年3月25日你需要:

past.set(Calendar.DAY_OF_MONTH, 25); 
past.set(Calendar.MONTH, 2);   // NOTE THE 2 
past.set(Calendar.YEAR, 2016); 

我怀疑你使用3,你需要2,并且有一天你看到的是因为你的测试日期是在午夜,你现在的日期不是。

除了你可能想要更好地处理时间,该代码的作品。

+1

@ transiti0nary:从根本上改变问题,一旦他们回答(或者坦白地说甚至在此之前,因为人们可能在寻找答案)在SO上是不合适的;问题并不意味着成为移动目标。如果您有新问题,请提出一个新问题。我已经回滚了编辑(您仍然可以获取其内容[这里](http://*.com/posts/36837338/revisions)来构建您的新问题)。 –

而是循环的,你可以做这样的:

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 
    long millisInADay = 1000 * 60 * 60 * 24; 

    return(pastDate.getTimeInMillis()-presentDate.getTimeInMillis())/millisInADay; 
} 
+0

请参阅[这里](http://*.com/a/3491711/157247)为什么这样天真地做这个主意不好。 –

+0

谢谢。我确实生产了另一个不涉及循环的实现,但现在我遇到了将闰年考虑进去的问题,即将日期转换为年。 JDK中是否有类似于我在实现中使用的TimeUnit枚举类型的转换工具,可以实现这一点?谢谢 – transiti0nary

+0

我认为在这种情况下使用LocalDate是最好的方法。 https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html –

确保在设置过去的日期,这几个月被视为形式0-11。

Calendar presentDate = Calendar.getInstance(); //25th April, 2016 
    Calendar pastDate = Calendar.getInstance(); 
    pastDate.set(2016, 2, 25); //its 25th March, 2016 here 
    int daysSince = 0; 
    while(pastDate.before(presentDate)){ 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } 
    System.out.println(daysSince); 
//output : 31 
+0

谢谢,我只是忘记了0-索引。然而,我现在遇到了另一个问题,我更新了描述它的原始文章。 – transiti0nary