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

17

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

第二件事是检查一个日期是否在另外两个日期之间。 例如,假设我有一个应用程序,显示我在接下来的10天内需要完成的事件(日程安排)。现在我如何判断我分配给某个事件的日期是否在今天和从今天开始10天后的日期之间?

7个回答

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);

使用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);
为了可靠地使用 Calendar#before()Calendar#after() 进行比较,我们需要先去除时间。假设现在是2010年5月24日上午9点,并且事件的日期已经设置为没有时间的2010年5月24日。当你想进行包容性比较时,你希望在同一天使其return true。也就是说,(event.equals(now) || event.after(now)) 或者更短但是等价的 (!event.before(now)) 应该返回 true。但实际上,由于 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).
}

是的,以上内容确实是您需要做的全部


16
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)); 
}

这是在使用JodaTime,对吧? - hotzen
这是一个大型的空指针检查反模式示例 :) - hotzen

5

如果你正在进行纯日期(而非日期时间)计算,JodaTime的LocalDate类将为你提供所需的一切。+1 - leonbloy


2

如果需要加上十天:

Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_YEAR, 10);

检查是否在两个日期之间:

myDate.after(firstDate) && myDate.before(lastDate);

0

要检查日期是否在两个日期之间,这里是一个简单的程序:

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

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

    String oeStartDateStr = "04/01/";
    String oeEndDateStr = "11/14/";

    Calendar cal = Calendar.getInstance();
    Integer year = cal.get(Calendar.YEAR);

    oeStartDateStr = oeStartDateStr.concat(year.toString());
    oeEndDateStr = oeEndDateStr.concat(year.toString());

    Date startDate = sdf.parse(oeStartDateStr);
    Date endDate = sdf.parse(oeEndDateStr);
    Date d = new Date();
    String currDt = sdf.format(d);


    if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){
        System.out.println("Date is between 1st april to 14th nov...");
    }
    else{
        System.out.println("Date is not between 1st april to 14th nov...");
    }
}

0

我采用了最初的答案并进行了一些修改。如果日期相等,则认为它们是“内部的”。

private static boolean between(Date date, Date dateStart, Date dateEnd) {
    if (date != null && dateStart != null && dateEnd != null) {
        return (dateEqualOrAfter(date, dateStart) && dateEqualOrBefore(date, dateEnd));

    }
    return false;
}

private static boolean dateEqualOrAfter(Date dateInQuestion, Date date2)
{
    if (dateInQuestion.equals(date2))
        return true;

    return (dateInQuestion.after(date2));

}
private static boolean dateEqualOrBefore(Date dateInQuestion, Date date2)
{
    if (dateInQuestion.equals(date2))
        return true;

    return (dateInQuestion.before(date2));

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接