在Java中检查日期是否在两个日期之间

2022-09-02 23:23:36

我想知道的一件事是,如何计算从今天起10天后的日期。

第二件事是检查一个日期是否在另外两个日期之间。例如,假设我有一个应用,它显示我在接下来的 10 天内需要执行哪些事件(计划程序)。现在,如何查看分配给某个事件的日期是否介于今天和距今天 10 天的日期之间?


答案 1

使用和比较日期是非常痛苦的,这就是为什么JodaTime存在的原因。到目前为止,没有一个答案涵盖了所讨论的时间。当日期具有非零时间时,比较可能会失败。目前还不清楚你是想要一个包容性的比较还是排他性的比较。到目前为止发布的大多数答案都表明存在排他性比较(即5月24日不是在5月20日至5月24日之间),而实际上,将其包括在内更有意义(即5月24日介于5月20日至5月24日之间)。java.util.Datejava.util.Calendar


我想知道的一件事是,如何计算从今天起10天后的日期。

使用标准的Java SE 6 API,您需要java.util.Calendar来实现此目的。

Calendar plus10days = Calendar.getInstance();
plus10days.add(Calendar.DAY_OF_YEAR, 10);

使用JodaTime,你会这样做:

DateTime plus10days = new DateTime().plusDays(10);

第二件事是检查一个日期是否在另外两个日期之间。例如,假设我有一个应用,它显示我在接下来的 10 天内需要执行哪些事件(计划程序)。现在,如何查看分配给某个事件的日期是否介于今天和距今天 10 天的日期之间?

现在是可怕的部分与.让我们先做好准备:Calendar

Calendar now = Calendar.getInstance();
Calendar plus10days = Calendar.getInstance();
plus10days.add(Calendar.DAY_OF_YEAR, 10);
Calendar event = Calendar.getInstance();
event.set(year, month - 1, day); // Or setTime(date);

为了可靠地比较使用 和 ,我们需要先摆脱时间。想象一下,现在是2010年5月24日上午9点,活动日期设置为2010年5月24日,没有时间。当您想要包容性比较时,您希望在同一天进行比较。即,两者或 - 更短但相等 - 都应返回 true。但实际上,由于中时间的存在,没有一个这样做。您需要先清除所有日历实例中的时间,如下所示:Calendar#before()Calendar#after()return true(event.equals(now) || event.after(now))(!event.before(now))now

calendar.clear(Calendar.HOUR);
calendar.clear(Calendar.HOUR_OF_DAY);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);

或者,您也可以仅按日/月/年进行比较。

if (event.get(Calendar.YEAR) >= now.get(Calendar.YEAR)
    && event.get(Calendar.MONTH) >= now.get(Calendar.MONTH)
    && event.get(Calendar.DAY_OF_MONTH) >= now.get(Calendar.DAY_OF_MONTH)
{
    // event is equal or after today.
}

非常详细。

使用JodaTime,你可以只使用DateTime#toLocalDate()来获取日期部分:

LocalDate now = new DateTime().toLocalDate();
LocalDate plus10days = now.plusDays(10);
LocalDate event = new DateTime(year, month, day, 0, 0, 0, 0).toLocalDate();
if (!event.isBefore(now) && !event.isAfter(plus10days)) {
    // Event is between now and 10 days (inclusive).
}

是的,以上就是您需要做的所有事情。


答案 2
public static boolean between(Date date, Date dateStart, Date dateEnd) {
    if (date != null && dateStart != null && dateEnd != null) {
        if (date.after(dateStart) && date.before(dateEnd)) {
            return true;
        }
        else {
            return false;
        }
    }
    return false;
}

编辑:另一个建议的变体:

public Boolean checkDate(Date startDate, Date endDate, Date checkDate) { 
    Interval interval = new Interval(new DateTime(startDate), 
                                     new DateTime(endDate));   
    return interval.contains(new DateTime(checkDate)); 
}