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

dim*_*tar 15 java date

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

第二件事是检查一个日期是否在另外两个日期之间.例如,假设我有一个应用程序,显示我在接下来的10天内需要做的事情(计划员).现在,我如何查看我分配给活动的日期是在今天和今天之后的10天之间?

Bal*_*usC 20

操纵和比较日期使用java.util.Datejava.util.Calendar非常痛苦,这就是JodaTime存在的原因.到目前为止,没有一个答案涵盖了有关时间.当日期具有非零时间时,比较可能失败.还不清楚您是否想要包容性独家比较.到目前为止发布的大多数答案都建议进行独家比较(即5月24日不是 5月20日到5月24日之间),而实际上将其包含在内更有意义的(即5月24日 5月20日到5月24日之间).


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

使用标准的Java SE 6 API,您需java.util.Calendar要这样做.

Calendar plus10days = Calendar.getInstance();
plus10days.add(Calendar.DAY_OF_YEAR, 10);
Run Code Online (Sandbox Code Playgroud)

有了JodaTime,你会这样做:

DateTime plus10days = new DateTime().plusDays(10);
Run Code Online (Sandbox Code Playgroud)

第二件事是检查一个日期是否在另外两个日期之间.例如,假设我有一个应用程序,显示我在接下来的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);
Run Code Online (Sandbox Code Playgroud)

为了可靠地比较使用Calendar#before()Calendar#after(),我们需要先摆脱时间.想象一下,它目前是2010年5月24日上午9点,该活动的日期定在2010年5月24日,没有时间.当您想要包容性比较时,您希望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);
Run Code Online (Sandbox Code Playgroud)

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

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.
}
Run Code Online (Sandbox Code Playgroud)

所有人都非常冗长.

使用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).
}
Run Code Online (Sandbox Code Playgroud)

是的,上面真的是所有你需要做的.


Kri*_*nan 15

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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)); 
}
Run Code Online (Sandbox Code Playgroud)


小智 5

使用JodaTime日历替换类:http://joda-time.sourceforge.net/