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

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

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

使用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))或-shorter但同样 – (!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). } 

是的,以上就是您需要做的一切。

 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日历替换类: http ://joda-time.sourceforge.net/

要添加十天:

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

检查两个日期之间是否:

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

你可以在这里找到更多答案

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

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

我采取了初步答案并对其进行了一些修改。 我考虑日期是否等于“内部”..

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