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

Gna*_*air 90 java date

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

Nat*_*ger 243

这可能更具可读性:

Date min, max;   // assume these are set to something
Date d;          // the date in question

return d.after(min) && d.before(max);
Run Code Online (Sandbox Code Playgroud)

  • 之间可以包括端点,在这种情况下你可以使用return!d.before(min)&&!d.after(max); (54认同)
  • 一个非常健康的 9 秒快,先生。 (2认同)
  • 这比“选定的已解决答案”更好吗? (2认同)

Pet*_*rey 115

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

Date a, b;   // assume these are set to something
Date d;      // the date in question

return a.compareTo(d) * d.compareTo(b) > 0;
Run Code Online (Sandbox Code Playgroud)

如果您希望范围包含在内

return a.compareTo(d) * d.compareTo(b) >= 0;
Run Code Online (Sandbox Code Playgroud)

  • 有效,但不可读.不管怎么说,还是要谢谢你. (26认同)
  • @Peter Lawrey Bruno意味着很难理解没有评论的代码. (3认同)
  • if(d == a || d == b)它不起作用. (2认同)
  • @junsid 对于包含范围,我添加了更新。谢谢你。 (2认同)

Jas*_*hen 39

像这样:

Date min, max;   // assume these are set to something
Date d;          // the date in question

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0;
Run Code Online (Sandbox Code Playgroud)

您可以使用>,而不是>=<,而不是<=从意识中排除端点"之间."


Bas*_*que 11

这里有几种使用Joda-Time 2.3库的方法.

一种方法是在DateTime实例上使用simple isBeforeisAfter方法.顺便说一句,Joda-Time中的DateTime在概念上类似于java.util.Date(Universe时间轴上的时刻)但包括时区.

另一种方法是在Joda-Time中构建一个Interval.该contains方法测试给定的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 );
Run Code Online (Sandbox Code Playgroud)

比较之前/之后的测试......

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

boolean is2Between1And3 = ( ( dateTime2.isAfter( dateTime1 ) ) && ( dateTime2.isBefore( dateTime3 ) ) );
Run Code Online (Sandbox Code Playgroud)

使用Interval方法代替isAfter/isBefore ...

Interval interval = new Interval( dateTime1, dateTime3 );
boolean intervalContainsDateTime2 = interval.contains( dateTime2 );
Run Code Online (Sandbox Code Playgroud)

转储到控制台......

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 );
Run Code Online (Sandbox Code Playgroud)

跑的时候......

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
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 8

另外一个选项

min.getTime() <= d.getTime() && d.getTime() <= max.getTime()
Run Code Online (Sandbox Code Playgroud)


man*_*noj 8

日期之间包括终点可以写成

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