Java代码,用于计算日期范围内的中夜数(00:00:00)

时间:2014-05-21 16:05:49

标签: java date datetime

我正在尝试编写一个java块来查找特定日期范围内的午夜数。

例如:

开始日期:05/01/2014 00:00:00 截止日期:05/03/2014 00:00:00

此范围内有3个半夜。

开始日期:05/01/2014 00:00:00 截止日期:05/02/2014 23:59:59

这只有一个。

它基本上要告诉我在日期范围内发生了多少次“00:00:00”。 请帮帮我。我尝试了很多方法,但没有一种方法是正确的。

5 个答案:

答案 0 :(得分:3)

我只计算天数(实际日期),如果最早的日期时间为00:00:00,则添加一天。

开始日期:05/01/2014 00:00:00结束日期:05/03/2014 00:00:00

  • 03 - 01 = 2天。
  • 由于开始日期的时间为00:00:00,因此请添加一个:
  • 2 + 1 = 3个午夜。

开始日期:05/01/2014 00:00:00结束日期:05/02/2014 23:59:59

  • 02 - 01 = 1天。
  • 由于开始日期的时间为00:00:00,因此请添加一个:
  • 1 + 1 = 2个午夜。

此外,

开始日期:2014年1月5日23:59:59结束日期:5/02/2014 00:00:01

  • 02 - 01 = 1天。
  • 由于开始日期的时间不是00:00:00,因此请勿添加一个:
  • 1午夜。

答案 1 :(得分:2)

一种选择是使用Joda-Time library

DateTimeZone zone = DateTimeZone.forID("America/New_York");

int days = Days.daysBetween(new DateTime(startDate, zone), new DateTime(endDate, zone)).getDays();

我认为这是最简单的方法。缺点是你还需要一个库..

希望这有帮助!

答案 2 :(得分:2)

使用Joda-Time的答案是不正确的。正如@khriskooper已经注意到了

之间的中午数
2014-05-01 00:00:00 and 2014-05-02 23:59:59

不是一个而是两个中午!

所以这里使用Joda-Time进行校正(未经测试),但它也可以是支持日程计算的任何其他库(旧Java-pre8不适用)。我省略了时区细节,因为我不认为它与问题真正相关。如果OP希望他可以将LocalDateTime替换为DateTime并应用时区。

LocalDateTime ldt1 = new LocalDateTime(2014, 5, 1, 0, 0, 0);
LocalDateTime ldt2 = new LocalDateTime(2014, 5, 2, 23, 59, 59);

int days = Days.daysBetween(ldt1.toLocalDate(), ldt2.toLocalDate()).getDays();
if (ldt1.toLocalTime().equals(new LocalTime(0, 0))) {
  days++;
}

答案 3 :(得分:0)

使用Joda的 DateTime 库(无论如何我推荐),一个优雅的方法是:

private int getNumberOfNights(DateTime start, DateTime end) {
    int nightCount = 0;
    DateTime tempEnd = new DateTime(end);

    while (tempEnd.withTimeAtStartOfDay().isAfter(start)) {
        nightCount++;
        tempEnd = tempEnd.minusDays(1);
    }

    return nightCount;
}

...或者如果你想避免使用while循环:

private int getNumberOfNights(DateTime start, DateTime end) {
    int nightCount = Days.daysBetween(start, end).getDays();
    DateTime leftOver = new DateTime(end.minusDays(nightCount));

    if (leftOver.withTimeAtStartOfDay().isAfter(start)) {
        nightCount++;
    }

    return nightCount;
}

答案 4 :(得分:0)

使用Java 7

public long countDays(Date dtStart, Date dtEnd) {
    long startDay = TimeUnit.DAYS.convert(dtStart.getTime(), TimeUnit.MILLISECONDS)
    long endDay = TimeUnit.DAYS.convert(dtEnd.getTime(), TimeUnit.MILLISECONDS)

    return endDay - startDay
}