如何获取两个日期之间的天数 - `java.util.Calendar`

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/24105380/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 10:10:39  来源:igfitidea点击:

How to get the the number of days between two dates - `java.util.Calendar`

javacalendarjfxtras

提问by user3719487

I'm trying to get the number of days between two dates. I'm working from Agenda, JFXtras.

我正在尝试获取两个日期之间的天数。我在 JFXtras 的 Agenda 工作。

The start time= getStartTime()returns java.util.Calendar
The end time= getEndTime()returns java.util.Calendar

开始时间= getStartTime()返回java.util.Calendar
结束时间= getEndTime()回报java.util.Calendar

This is what I've got so far:

这是我到目前为止所得到的:

void printAppointment(Appointment a) throws ParseException {
        System.out.println(a.getSummary());
        System.out.println(a.getDescription());

        DateFormat formatter = new SimpleDateFormat("yyyy, MMM dd h:mm:ss a z");
        System.out.println(formatter.format(a.getStartTime().getTime()));
        System.out.println(formatter.format(a.getEndTime().getTime()));
        System.out.println(a.getAppointmentGroup());
        System.out.println(a.getLocation());

        // My problem starts here
        Calendar cal1 = new GregorianCalendar();
        Calendar cal2 = new GregorianCalendar();

        SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

        Date date = sdf.parse(formatter.format(a.getStartTime().getTime()));
        cal1.setTime(date);
        date = sdf.parse(formatter.format(a.getEndTime().getTime()));
        cal2.setTime(date);
        // System.out.println("Days difference = " + daysBetween(cal1.getTime(), cal2.getTime()));
        System.out.println("Days difference = can't be set");
    }

    private int daysBetween(Date d1, Date d2) {
        return (int) ((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
    }

After // My problem starts hereI get nothing. The following gets printed:

// My problem starts here我什么都没有之后。打印以下内容:

Another Morning appointment
Another Description of morning appointment
2014, Jun 12 6:00:00 AM PDT
2014, Jun 13 2:00:00 AM PDT
jfxtras.labs.scene.control.Agenda$AppointmentGroupImpl@16e4577
null

Note that the difference in days gets left out.

请注意,天数的差异被忽略了。

If anyone could help me out, I'll be more than greatful. Thank you all.

如果有人能帮助我,我会非常感激。谢谢你们。

Update:

更新:

This is the final working implementation that does the difference in Days, Hours, Minutes and seconds as the attempt below shows.

这是最终的工作实现,它在天数、小时数、分钟数和秒数上有所不同,如下面的尝试所示。

Pel
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget ti
2014. Jun Mon.9 3:18PM
2014. Jun Wed.11 3:18PM
jfxtras.labs.scene.control.Agenda$AppointmentGroupImpl@12e3872
null
diffSeconds difference = 172800
diffMinutes difference = 2880
diffHours difference = 48
diffDays difference = 2

This is the code that does that

这是执行此操作的代码

void printAppointment(Appointment a) {
    System.out.println(a.getSummary());
    System.out.println(a.getDescription());

    DateFormat formatter = new SimpleDateFormat("yyyy. MMM EEE.d h:mma");
    System.out.println(formatter.format(a.getStartTime().getTime()));
    System.out.println(formatter.format(a.getEndTime().getTime()));
    System.out.println(a.getAppointmentGroup());
    System.out.println(a.getLocation());
    this.daysBetween(a.getStartTime().getTimeInMillis(), a.getEndTime().getTimeInMillis());

}

private void daysBetween(long t1, long t2) {
    int diff = (int) (t2 - t1);

    long diffSeconds = diff / 1000;
    long diffMinutes = diff / (60 * 1000);
    long diffHours = diff / (60 * 60 * 1000);
    long diffDays = diff / (24 * 60 * 60 * 1000);

    System.out.println("diffSeconds difference = " + diffSeconds);
    System.out.println("diffMinutes difference = " + diffMinutes);
    System.out.println("diffHours difference = " + diffHours);
    System.out.println("diffDays difference = " + diffDays);
}

采纳答案by Simon

Instead of passing a Date to daysBetween, pass a long. You can get the current time (since Jan 1 1970) from a Calendar using getTimeInMillis(). Your code will now look as follows:

不是将 Date 传递给 daysBetween,而是传递一个 long。您可以使用 getTimeInMillis() 从日历中获取当前时间(自 1970 年 1 月 1 日以来)。您的代码现在将如下所示:

void printAppointment(Appointment a) throws ParseException {
    System.out.println(a.getSummary());
    System.out.println(a.getDescription());

    System.out.println(formatter.format(a.getStartTime().getTime()));
    System.out.println(formatter.format(a.getEndTime().getTime()));
    System.out.println(a.getAppointmentGroup());
    System.out.println(a.getLocation());


    System.out.println("Days difference = " + daysBetween(a.getStartTime().getTimeInMillis(), a.getEndTime().getTimeInMillis()));
}

private int daysBetween(long t1, long t2) {
    return (int) ((t2 - t1) / (1000 * 60 * 60 * 24));
} 

回答by mschenk74

If you are allowed to use Java 8 than you should have a look at the answer from https://stackoverflow.com/users/288671/vitalii-fedorenkofor the question Difference in days between two dates in Java?

如果您被允许使用 Java 8,那么您应该查看https://stackoverflow.com/users/288671/vitalii-fedorenko 中关于Java 中两个日期之间的天数差?

There are several reasons for the introduction of the new API in Java 8 - the correct handling of time differences was one of those reasons. (In some timezones there might have been changes affecting the calculation - so just dividing the difference in millis will lead to unexpected results if there are daytime adjustments or similar things)

在 Java 8 中引入新 API 有几个原因——正确处理时间差异是其中一个原因。(在某些时区,可能会有影响计算的变化——所以如果有白天的调整或类似的事情,只需将差异除以毫秒就会导致意想不到的结果)