如何检查当前日期是否在 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
.
的东西
我正在尝试创建一个应用程序,但一直在计算今天是否在学年。用户输入两个日期,没有年份,每年重复一次。这些是学年的开始和结束日期。
我想检查当前日期是否在这两个日期之间,即使它重叠两年。因此,如果学校在 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
.