如何检查一个日期是否在另外两个日期之间,在这种情况下,所有三个日期都由java.util.Date
的实例表示?
这可能会更易读一些:
Date min, max; // assume these are set to something
Date d; // the date in question
return d.after(min) && d.before(max);
如果您不知道最小/最大值的顺序
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;
你可以使用以下方法将null
视为无限制:
null
as unconstrained withif (a == null) {
return b == null || d.compareTo(b) < 0;
} else if (b == null) {
return a.compareTo(d) < 0;
} else {
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.compareTo(min) >= 0 && d.compareTo(max) <= 0;
您可以使用>
代替>=
,并使用<
代替<=
,以从“之间”概念中排除端点。
Date date1 = new Date(2006, 1, 1); // Jan 1,2006 Date date2 = new Date(2006, 4, 1); // Apr 1, 2006 System.out.println(date1.compareTo(date2)); // -1 System.out.println(date2.compareTo(date1)); // 1
。你能在这里分享一下你遇到的不工作的问题吗? - Gnanambetween
的确切答案,其他答案是针对日期的 within
。 - Mr. Mak包含两个端点的日期区间可以写作:
public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){
return !(date.before(min) || date.after(max));
}
注意:正如@Ponmudi在评论中指出的那样,如果日期在毫秒级别上有所不同,则此解决方案可能无法正常工作。
以下是使用Joda-Time 2.3库完成此操作的几种方法。
一种方法是在DateTime实例上使用简单的isBefore
和isAfter
方法。顺便说一句,在Joda-Time中,DateTime与java.util.Date(宇宙时间轴上的一个时刻)的概念类似,但包括时区。
另一种方式是在Joda-Time中构建一个Interval对象。 contains
方法测试给定的DateTime是否在Interval所覆盖的时间范围内。 Interval的开始是包含的,但端点是排除的。这种方法被称为“半开放”,符号为[)
。
请参见以下代码示例中的两种方法。
将java.util.Date实例转换为Joda-TimeDateTime
实例。只需将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 );
通过测试比较before/after...
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
另一个选项
min.getTime() <= d.getTime() && d.getTime() <= max.getTime()
请看下面:
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 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)
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年之前的日期,可以编辑代码,但不确定在这种情况下会发生什么。
after()
和before()
的问题,它们都是排除类型,这意味着after()
不会给出d
天的结果。我有一个相同的场景,需要在报告中包含min
和max
日期,使用if((date.after(fromDate) || date.compareTo(fromDate)==0) && (date.before(toDate) || date.compareTo(toDate)==0 ))
没有任何结果,请建议好的方法。 - MegaBytes