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

在java中,如何检查当前日期是否介于两个重复出现的日期之间?,java,date,jodatime,Java,Date,Jodatime,我正在尝试创建一个应用程序,但在计算今天是否在学年时遇到了麻烦。用户输入每年重复出现的两个日期,没有年份。这些是学年的开始和结束日期 我想检查当前日期是否在这两个日期之间,即使它重叠两年。所以,如果学校从11月开学,到6月结束,如果今天是1月22日,它应该会变成现实。但如果是7月,它应该返回false 我确实发现了这个问题:,但它适用于没有假期的学年 顺便说一句,如果有帮助的话,我还有时间 提前谢谢。嗯,我想了一下,找到了一些解决方案,但这似乎很简单 //parse both enddate/s

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

我想检查当前日期是否在这两个日期之间,即使它重叠两年。所以,如果学校从11月开学,到6月结束,如果今天是1月22日,它应该会变成现实。但如果是7月,它应该返回false

我确实发现了这个问题:,但它适用于没有假期的学年

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


提前谢谢。

嗯,我想了一下,找到了一些解决方案,但这似乎很简单

//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年,它都可以工作。

问题不清楚 你的问题不清楚

首先,如果用户输入的日期没有年份,那么他们就没有输入日期。他们正在输入一个月号和一个月中的一天号

也许问题是:

确定一个给定的目标日期是否可能包含在一对月份和月数定义的两个区间中的一个。我们假设这对代表不到一年的时间跨度

乔达时间 如果这是个问题,那么下面是一些使用Joda Time2.7的代码。两个警告:

您可能可以使用月数和月日数的巧妙比较来做一些简短的事情。但为了教育起见,并允许对类似问题有更多的灵活性,我使用了Joda Time特性。 这段代码中只进行了很少的思考和测试。尝试各种值进行更多测试,并在生产中使用之前重新考虑逻辑。 事实证明,它有一个类,正是你需要的

MonthDay mdStart = new MonthDay ( DateTimeConstants.NOVEMBER, 1 );
MonthDay mdStop = new MonthDay ( DateTimeConstants.JUNE, 1 );
请注意,时区对于确定某个时刻(如现在)的月份和日期至关重要。例如,在巴黎午夜过后的某个时刻,蒙特勒阿尔山仍然是“昨天”。请不要使用3-4个字母的代码

DateTime target = DateTime.now ( DateTimeZone.forID ( "Africa/Casablanca" ) ); // Using current date-time, but could be any date-time.
该方法从MonthDay、月数和日数中获取数据字段,并将其应用于现有DateTime以创建新的DateTime实例。Joda Time使用,因此我们基于旧实例创建一个新实例,而不是修改旧实例

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

其中,MonthDay对象对是以目标日期时间的年份结束的时间跨度。早间休息 其中,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 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 );
现在测试目标日期时间是否包含在间隔内。请注意,Joda Time明智地使用了半开放的方法来定义时间跨度,其中开始是包含的,而结束是独占的。因此,在我们的示例中,6月1日不在我们的范围内。这意味着,如果目标是11月1日,我们将获得成功,但如果目标是6月1日,我们将失去成功

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

Boolean targetContained = ( earlierHasTarget || laterHasTarget );
java.time
Java8有Java.time,这是一个受Joda time启发的新日期时间框架。虽然在很大程度上类似于Joda Time,但它并不是一个直接的替代品。每一个都有另一个所缺乏的特点。特别是,java.time没有与Interval等价的内容。

这篇文章的主要答案是Joda time解决方案:或者基于Joda time的全新Java8日期和时间功能:@BasilBourque这个问题不是重复的。这是一个更复杂的情况,您不知道开始日期和结束日期的年份。重复问题: