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

问题描述:

我想知道的一件事是如何计算从今天起10天后的日期。检查日期是在Java中的两个日期之间

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

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

+0

+1特别是如果你正在做简单的日期(而不是日期时间)计算,JodaTime的LocalDate类为您提供了所有您需要的内容。 – leonbloy 2010-05-24 13:24:38

要添加十天

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

要检查两个日期之间:

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

可以使用java.util.Date找到更多的答案here

操纵和比较日期和java.util.Calendar是相当痛苦,这就是为什么JodaTime存在。迄今没有任何答案涵盖了时间有问题。当日期的时间非零时,比较可能会失败。目前还不清楚你是否想要包括独家比较。大多数发布至今建议独家对比的答案(即5月24日是5月20日和5月24日之间未),而在实际它会更有意义,使其包容(五月即24 是五月 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))或-shorter,但同样-应该返回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). 
} 

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

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)); 
} 
+0

这是使用JodaTime,不是吗? – hotzen 2017-05-19 13:32:37

+0

,这是一个巨大的NULL检查反模式示例:) – hotzen 2017-05-19 13:32:56

我把最初的回答,并修改它一下。我认为,如果日期是等于为“内部” ..

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

} 

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

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..."); 
    } 
}