如何使用java.util.Calendar.类在每年的同一日期设置一个重复出现的假期(不考虑年份组件)?

问题描述 投票:0回答:1

我的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 unit-testing junit gregorian-calendar java.util.calendar
1个回答
2
投票

你使用的是可怕的日期-时间类,这些类在多年前就被 "日历 "所取代了。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() ) ;
© www.soinside.com 2019 - 2024. All rights reserved.