我的WorkdayCalendar.class需要2个方法:-setHoliday(Calendar date),只在该年内设置一个假日-setRecurringHoliday(Calendar date),应该(最好)使用setHoliday()并设置它每年重复出现。我如何实现检查是否是新的一年的逻辑?我正在将假期添加到一个名为 holidaysList 的 HashSet 中。我需要一个方法来检查是否是新的一年,然后添加一个指定的假日。setHoliday的工作很好,并且已经进行了单元测试。
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;
}
你使用的是可怕的日期-时间类,这些类在多年前就被 "日历 "所取代了。java.time JSR 310中定义的类。
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() ) ;