2

我搜索了这个,所以有很多帖子问这个问题,但所有答案都是difference In Milliseconds / (24* 1000 * 60 * 60)给出两个日期之间的 24 小时数。但我需要两个日期之间的天数。

即 if date1is09/09/13 09:00date2is10/09/13 22:00我需要差异 as0而不是1因为date1anddate2是连续天(即使它们之间有超过 24 小时的间隔)。

注意:我知道删除时间部分并使用该 difference In Milliseconds / (24* 1000 * 60 * 60)方法。我正在寻找更好的解决方案。

更新:该应用程序首先在09/09/13 09:00其周三使用,然后该应用程序在 2013 年 10 月 9 日 22:00` 周四使用。现在用户在周三和周四都使用了该应用程序,即使有超过 24 小时的差距。现在,如果我计算两个日期之间的 24 小时数,它会给出一个。因为两个日期之间有一天的差距。我需要它给零,因为用户在周三和周四使用它,周三和周四之间没有一天。希望你理解我的问题。如果您仍然没有离开它,我会尽力解释。

4

5 回答 5

1
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class test {

    public static void main(String[] args) throws ParseException {

        String dateStart = "09/09/13 09:00";
        String dateStop = "10/09/13 22:00";

        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");

        Date date1 = format.parse(dateStart);
        Date date2 = format.parse(dateStop);

            // calculate difference in milliseconds
        long diff = (date2.getTime() - date1.getTime()) - 86400000;
        diff = (diff <= 0 ? 0 : diff);

        System.out.println(TimeUnit.MILLISECONDS.toDays(diff));
    }

}

这将给出 2 个日期之间的差异。并减去一天(如果为负,则将差值设置为 0 天)。只要 dateStop 大于 dateStart,这将起作用,否则它只会打印 0;

于 2013-10-11T11:35:45.220 回答
1

这是一个简单的解决方案:

Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);

while(calendar.getTime().before(endDate))
 {
    noOfDays++;
    calendar.add(Calendar.DAY_OF_MONTH,1);
 }

其中 startDate 和 endDate 是Date类的实例。

注意:您需要初始化日期对象,以便它们具有相同的时间,但它们的日期不同。将它们都设置为 12 AM 应该可以解决问题:

date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
于 2013-10-11T11:31:11.750 回答
1

我已经避免使用Joda Time很长时间了,但在过去的一周里,我开始使用它来解决这个问题。这是非常值得的!

在处理纯 Java 时很容易引入一些奇怪的日期处理错误 - 例如夏令时更改时会发生什么。Joda Time 已经构建了所有这些异常。

在此处检查相关问题:


更新

从 Java 8 开始,时间和日期功能得到了改进,Joda Time 团队建议使用它而不是他们的库。这是他们在登陆页面上所说的:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

感谢 Basil Bourque 的评论。

于 2013-10-11T12:02:38.607 回答
0

你可以使用这个技巧: if date1is beforedate2你可以设置 hour in date1to1和 in date2to 0。这样,整个时差中的小时部分永远不会大于 24 小时,因此不会影响计算,因此只有天/月/年重要。

这是代码示例

public static long daysBetween(Date date1, Date date2) {
    Calendar c1 = Calendar.getInstance();
    c1.setTime(date1);

    Calendar c2 = Calendar.getInstance();
    c2.setTime(date2);
    if (date1.before(date2)) {
        c1.set(Calendar.HOUR_OF_DAY, 1);
        c2.set(Calendar.HOUR_OF_DAY, 0);
    } else {
        c2.set(Calendar.HOUR_OF_DAY, 1);
        c1.set(Calendar.HOUR_OF_DAY, 0);
    }

    return (c2.getTimeInMillis() - c1.getTimeInMillis())
            / (24 * 60 * 60 * 1000);
}

//DEMO
public static void main(String[] args) throws Exception {
    DateFormat df = new SimpleDateFormat("dd/MM/yy hh:mm");
    Date date1 = df.parse("09/09/13 09:00");
    Date date2 = df.parse("11/09/13 22:00");

    System.out.println(daysBetween(date1, date2));
}

输出:1


日期11/09/13 09:00 09/09/13 22:00结果将是-1因为date1在之后date2

于 2013-10-11T13:31:22.167 回答
0
于 2018-03-16T21:06:22.773 回答