如何检查当前日期是否在 java 中的两个重复日期之间?

How to check if current date is between two reoccurring dates in java?

我正在尝试创建一个应用程序,但一直在计算今天是否在学年。用户输入两个日期,没有年份,每年重复一次。这些是学年的开始和结束日期。

我想检查当前日期是否在这两个日期之间,即使它重叠两年。因此,如果学校在 11 月开学,并在 6 月结束,如果今天是 1 月 22 日,它应该 return 为真。但如果是七月,它应该 return false.

我确实找到了这个问题:Php - work out what academic year it is,但它适用于没有假期的学年。

顺便说一句,如果有帮助的话,我有 joda 时间。

提前致谢。

//parse both enddate/startdate to same year

if(enddate>startdate)
enddate+=1 year;

if(today>startdate and today<enddate)
return true;

好吧,我想了一下,找到了一些解决方案,但这似乎是最简单的。

private boolean isInSchoolYear(DateTime now, DateTime schoolYearStart, DateTime schoolYearEnd){
    int thisYear = now.getYear();
    schoolYearStart = schoolYearStart.withYear(thisYear);
    schoolYearEnd = schoolYearEnd.withYear(thisYear);

    if(schoolYearStart.isBefore(schoolYearEnd)){
        return new Interval(schoolYearStart, schoolYearEnd).contains(now);
    }
    else{
        return !(new Interval(schoolYearEnd, schoolYearStart).contains(now));
    }
}

如果学年重叠 2 年或 1 年,这种方式都有效。

问题不清楚

你的问题不清楚。

一方面,如果用户输入没有年份的日期,那么他们就没有输入日期。他们正在输入月号和月号。

也许问题是:

Determine if a given target date (perhaps today) is contained within either of two intervals defined by a pair of month & day-of-month numbers (a "MonthDay") where we consider the pair to either (a) end in the date’s year or (b) begin in the date’s year. We assume the pair represents a span of time of less than one year.

乔达时间

如果这是问题,那么这里是一些使用 Joda-Time 2.7 的代码。两个注意事项:

  • 您可以使用月份数字和日期数字的巧妙比较来做一些更短的事情。但为了教育,并为类似问题提供更大的灵活性,我正在使用 Joda-Time 功能。
  • 此代码仅进行了最少的思考和测试。尝试各种值进行更多测试,并在用于生产之前重新考虑逻辑。

事实证明 Joda-Time has a MonthDay class,正是您所需要的。

MonthDay mdStart = new MonthDay ( DateTimeConstants.NOVEMBER, 1 );
MonthDay mdStop = new MonthDay ( DateTimeConstants.JUNE, 1 );

请注意,时区对于确定当前时刻的月份和日期至关重要。例如,在巴黎午夜过后的某个时刻,在蒙特利尔仍然是“昨天”。使用 proper time zone names,永远不要使用 3-4 字母代码。

DateTime target = DateTime.now ( DateTimeZone.forID ( "Africa/Casablanca" ) ); // Using current date-time, but could be any date-time.

toDateTime method takes data fields from the MonthDay (the month number and the day number) and applies them to an existing DateTime to create a new DateTime instance. Joda-Time uses immutable objects,所以我们在旧实例的基础上创建新实例,而不是修改旧实例。

让我们考虑两种可能的时间跨度:

  • 其中一对 MonthDay 对象是目标 DateTime 的年份 ending 的时间跨度。 (较早的间隔)
  • 其中一对 MonthDay 对象是目标 DateTime 的年份开始 的时间跨度。 (稍后间隔)

首先,较早的间隔。

// Determine a span of time, moving the Start to previous year if need be.
DateTime earlierStart = mdStart.toDateTime ( target ); // Overlay the data fields of the MonthDay on top of the data fields of a DateTime to create a new DateTime object.
DateTime earlierStop = mdStop.toDateTime ( target );
if ( earlierStart.isAfter ( earlierStop ) ) {  // If the start would land after the stop, then adjust the start to *previous* year.
    earlierStart = earlierStart.minusYears ( 1 );
}

Joda-Time 还提供 Interval class 用于将时间跨度定义为时间轴上的一对特定点。

Interval earlierInterval = new Interval ( earlierStart, earlierStop );

// Determine a span of time, moving the Stop to next year if need be.
DateTime laterStart = mdStart.toDateTime ( target ); // Overlay the data fields of the MonthDay on top of the data fields of a DateTime to create a new DateTime object.
DateTime laterStop = mdStop.toDateTime ( target );
if ( laterStart.isAfter ( laterStop ) ) {  // If the start would land after the stop, then adjust the start to *next* year.
    laterStop = laterStop.plusYears ( 1 );
}
Interval laterInterval = new Interval ( laterStart, laterStop );

现在测试目标 DateTime 是否包含在 Interval 中。请注意,Joda-Time 明智地使用 Half-Open 方法来定义时间跨度,其中开始是 inclusive 而结束是 独家。因此,在我们的示例中,6 月 1 日 不在我们的范围内 。这意味着如果目标是 11 月 1 日,我们就会命中,但如果目标是 6 月 1 日,我们就会失手。

Boolean earlierHasTarget = earlierInterval.contains ( target );
Boolean laterHasTarget = laterInterval.contains ( target );

Boolean targetContained = ( earlierHasTarget || laterHasTarget );

java.time

Java 8 有 java.time,一个受 Joda-Time 启发的新日期时间框架。虽然与 Joda-Time 大体相似,但它不是直接替代品。每个都有对方所没有的特点。特别是,java.time 缺少任何等同于 Interval.

的东西