如何使用 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() ) ;