如何使用 java.util.Calendar 使用 java 设置每年同一日期的重复假期(忽略年份部分)?
How to set a recurring holiday on the same date every year (disregarding the year component) with java using java.util.Calendar?
我正在制作一个日历,允许您添加每年自动重现的特定假期。
我的 WorkdayCalendar.class 需要两种方法:
-setHoliday(Calendar date) 仅在该年内设置假期
-setRecurringHoliday(Calendar date) 应该(最好)使用 setHoliday() 并将其设置为每年重复一次。
如何实现检查是否是新的一年的逻辑?我正在将假期添加到名为 holidaysList 的 HashSet。我需要一种方法来检查它是否是新的一年,然后添加一个指定的假期。
setHoliday 工作正常并且已经通过 unitTests 进行了测试。
public void setHoliday(Calendar date) {
this.date = date.getTime();
if (!isHoliday(date)) {
holidaysList.add(this.date);
}
}
public void setRecurringHoliday(Calendar date) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
GregorianCalendar todaysDate = new GregorianCalendar();
System.out.println(
sdf.format("Todays date: " + todaysDate.getTime()) + "\n");
int thisYear = todaysDate.get(Calendar.YEAR);
int chosenYear = date.get(Calendar.YEAR);
System.out.println("Chosen year: " + chosenYear + "\nThis year: " + thisYear);
date.add(Calendar.YEAR, 1);
int nextYear = date.get(Calendar.YEAR);
System.out.println("Next year: " + nextYear);
/*What to do here???*/
if (thisYear == nextYear){
setHoliday(date);
System.out.println("recurring holiday added");
}
}
private boolean isHoliday(Calendar date) {
this.date = date.getTime();
return isWeekend(date) || holidaysList.contains(this.date);
}
private boolean isWeekend(Calendar date) {
int chosenDay = date.get(Calendar.DAY_OF_WEEK);
return chosenDay == Calendar.SATURDAY || chosenDay == Calendar.SUNDAY;
}
您使用的是多年前被 JSR 310 中定义的 java.time 类 取代的糟糕日期时间 类。
MonthDay
对于没有年份的月份和日期,使用 MonthDay
。
MonthDay xmas = MonthDay.of( Month.DECEMBER , 25 ) ;
你的假期集应该是一组MonthDay
对象,从你的问题我可以看出。我发现您的整体问题令人困惑,因为它的逻辑不符合您通常工作场所假期跟踪所需的内容。
Set< MonthDay > holidays = new TreeSet<>() ;
holidays.add( xmas ) ;
对于日期,使用 LocalDate
。
申请年份以获得日期。
LocalDate xmas2020 = xmas.atYear( 2020 ) ;
要获取当前年份,请使用 Year
,并指定时区。对于任何给定的时刻,日期,因此可能是年份,在全球范围内因地区而异。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
Year currentYear = Year.now( z ) ;
LocalDate xmasThisYear = currentYear.atMonthDay( xmas ) ;
明年添加到 Year
。
Year nextYear = currentYear.plusYears( 1 ) ;
LocalDate xmasNextYear = nextYear.atMonthDay( xmas ) ;
询问日期是今年还是明年。
boolean isThisYear = Year.from( localDate ).equals( currentYear ) ;
boolean isNextYear = Year.from( localDate ).equals( nextYear ) ;
boolean isFutureYear = Year.from( localDate ).isAfter( currentYear ) ;
为了检查周末,定义 EnumSet
所需的星期几值,如 DayOfWeek
枚举中所定义。
Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;
boolean isWeekend = weekend.contains( localDate.getDayOfWeek() ) ;
我正在制作一个日历,允许您添加每年自动重现的特定假期。 我的 WorkdayCalendar.class 需要两种方法: -setHoliday(Calendar date) 仅在该年内设置假期 -setRecurringHoliday(Calendar date) 应该(最好)使用 setHoliday() 并将其设置为每年重复一次。 如何实现检查是否是新的一年的逻辑?我正在将假期添加到名为 holidaysList 的 HashSet。我需要一种方法来检查它是否是新的一年,然后添加一个指定的假期。 setHoliday 工作正常并且已经通过 unitTests 进行了测试。
public void setHoliday(Calendar date) {
this.date = date.getTime();
if (!isHoliday(date)) {
holidaysList.add(this.date);
}
}
public void setRecurringHoliday(Calendar date) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
GregorianCalendar todaysDate = new GregorianCalendar();
System.out.println(
sdf.format("Todays date: " + todaysDate.getTime()) + "\n");
int thisYear = todaysDate.get(Calendar.YEAR);
int chosenYear = date.get(Calendar.YEAR);
System.out.println("Chosen year: " + chosenYear + "\nThis year: " + thisYear);
date.add(Calendar.YEAR, 1);
int nextYear = date.get(Calendar.YEAR);
System.out.println("Next year: " + nextYear);
/*What to do here???*/
if (thisYear == nextYear){
setHoliday(date);
System.out.println("recurring holiday added");
}
}
private boolean isHoliday(Calendar date) {
this.date = date.getTime();
return isWeekend(date) || holidaysList.contains(this.date);
}
private boolean isWeekend(Calendar date) {
int chosenDay = date.get(Calendar.DAY_OF_WEEK);
return chosenDay == Calendar.SATURDAY || chosenDay == Calendar.SUNDAY;
}
您使用的是多年前被 JSR 310 中定义的 java.time 类 取代的糟糕日期时间 类。
MonthDay
对于没有年份的月份和日期,使用 MonthDay
。
MonthDay xmas = MonthDay.of( Month.DECEMBER , 25 ) ;
你的假期集应该是一组MonthDay
对象,从你的问题我可以看出。我发现您的整体问题令人困惑,因为它的逻辑不符合您通常工作场所假期跟踪所需的内容。
Set< MonthDay > holidays = new TreeSet<>() ;
holidays.add( xmas ) ;
对于日期,使用 LocalDate
。
申请年份以获得日期。
LocalDate xmas2020 = xmas.atYear( 2020 ) ;
要获取当前年份,请使用 Year
,并指定时区。对于任何给定的时刻,日期,因此可能是年份,在全球范围内因地区而异。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
Year currentYear = Year.now( z ) ;
LocalDate xmasThisYear = currentYear.atMonthDay( xmas ) ;
明年添加到 Year
。
Year nextYear = currentYear.plusYears( 1 ) ;
LocalDate xmasNextYear = nextYear.atMonthDay( xmas ) ;
询问日期是今年还是明年。
boolean isThisYear = Year.from( localDate ).equals( currentYear ) ;
boolean isNextYear = Year.from( localDate ).equals( nextYear ) ;
boolean isFutureYear = Year.from( localDate ).isAfter( currentYear ) ;
为了检查周末,定义 EnumSet
所需的星期几值,如 DayOfWeek
枚举中所定义。
Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;
boolean isWeekend = weekend.contains( localDate.getDayOfWeek() ) ;