如何确定date是否在Java中的两个date之间?

如何检查date是否在两个其他date之间,如果所有三个date都由java.util.Date的实例表示?

如果您不知道最小/最大值的顺序

 Date a, b; // assume these are set to something Date d; // the date in question return a.compareTo(d) * d.compareTo(b) > 0; 

如果你想要的范围是包容性的

 return a.compareTo(d) * d.compareTo(b) >= 0; 

这可能会更可读:

 Date min, max; // assume these are set to something Date d; // the date in question return d.after(min) && d.before(max); 

像这样:

 Date min, max; // assume these are set to something Date d; // the date in question return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

您可以使用>代替>=<而不是<=从“之间”的意义上排除端点。

这里有一些使用Joda-Time 2.3库的方法。

一种方法是在DateTime实例上使用简单的isBeforeisAfter方法。 顺便说一下,Joda-Time中的DateTime在概念上与java.util.Date(宇宙时间轴上的一个时刻)类似,但包含一个时区。

另一种方法是在乔达时间build立一个时间间隔。 contains方法testing给定的DateTime是否在Interval覆盖的时间范围内发生。 Interval的开始是包容性的,但端点是独占的。 这种方法被称为“半开放”,象征性的[)

在下面的代码示例中查看这两种方法。

将java.util.Date实例转换为Joda-Time DateTime实例。 只需将Date实例传递给DateTime的构造函数。 实际上,您还应该传递特定的DateTimeZone对象,而不是依赖JVM的默认时区。

 DateTime dateTime1 = new DateTime( new java.util.Date() ).minusWeeks( 1 ); DateTime dateTime2 = new DateTime( new java.util.Date() ); DateTime dateTime3 = new DateTime( new java.util.Date() ).plusWeeks( 1 ); 

通过testing之前/之后比较…

 boolean is1After2 = dateTime1.isAfter( dateTime2 ); boolean is2Before3 = dateTime2.isBefore( dateTime3 ); boolean is2Between1And3 = ( ( dateTime2.isAfter( dateTime1 ) ) && ( dateTime2.isBefore( dateTime3 ) ) ); 

使用Interval方法而不是isAfter / isBefore …

 Interval interval = new Interval( dateTime1, dateTime3 ); boolean intervalContainsDateTime2 = interval.contains( dateTime2 ); 

转储到控制台…

 System.out.println( "DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1 ); System.out.println( "is1After2 " + is1After2 ); System.out.println( "is2Before3 " + is2Before3 ); System.out.println( "is2Between1And3 " + is2Between1And3 ); System.out.println( "intervalContainsDateTime2 " + intervalContainsDateTime2 ); 

当运行…

 DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 is1After2 false is2Before3 true is2Between1And3 true intervalContainsDateTime2 true 

另一种select

 min.getTime() <= d.getTime() && d.getTime() <= max.getTime() 

你可能想看看乔达时间这是一个非常好的API来处理date/时间。 即使你真的不需要这个解决scheme来解决你目前的问题,但是将来也不会让你痛苦的。

 import java.util.Date; public class IsDateBetween { public static void main (String[] args) { IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date } public IsDateBetween(String dd) { long from=Date.parse("01/01/2000"); // From some date long to=Date.parse("12/12/2010"); // To Some Date long check=Date.parse(dd); int x=0; if((check-from)>0 && (to-check)>0) { x=1; } System.out.println ("From Date is greater Than ToDate : "+x); } } 

您可以使用getTime()并比较返回的长UTC值。

编辑,如果你确定你不会处理1970年之前的date,不知道它将如何performance在这种情况下。

以下是如何find今天是否在2个月之间:

 private boolean isTodayBetween(int from, int to) { if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) { throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to); } Date now = new Date(); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(now); int thisMonth = cal.get(Calendar.MONTH); if (from > to) { to = to + Calendar.DECEMBER; thisMonth = thisMonth + Calendar.DECEMBER; } if (thisMonth >= from && thisMonth <= to) { return true; } return false; } 

并称之为:

 isTodayBetween(Calendar.OCTOBER, Calendar.MARCH) 

干得好:

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

date之间包括终点可以写成

 public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){ return !(date.before(min) || date.after(max)); }