检查日期是否在Java中的两个日期之间
我想知道的一件事是如何计算从今天起10天的日期。
第二件事是检查一个日期是否在两个其他日期之间。 例如,假设我有一个应用程序,显示我在接下来的10天内需要做的事情(计划员)。 现在,我如何查看我分配给活动的日期是否在今天和今天之后的10天之间?
使用java.util.Date
和java.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类的before , after和compareTo方法。
这是一些例子
http://www.roseindia.net/java/example/java/util/CompareDate.shtml
http://www.javafaq.nu/java-example-code-287.html
http://www.esus.com/javaindex/j2se/jdk1.2/javautil/dates/comparingdates.html
这是Date类的API
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html
祝好运!
要添加十天:
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)); }