如何在Java中将工作日添加到当前日期?
public Calendar addBusinessDate(Calendar cal, int days) { // // code goes over here // }
它也应该考虑周末。
您可能要考虑使用ObjectLab Kit为您完成繁重的工作。
假设要求只是在计算日期为非工作日时返回下一个工作日:
package bizdays.example; import java.time.LocalDate; import java.util.HashSet; import net.objectlab.kit.datecalc.common.DateCalculator; import net.objectlab.kit.datecalc.common.DefaultHolidayCalendar; import net.objectlab.kit.datecalc.common.HolidayHandlerType; import net.objectlab.kit.datecalc.jdk8.LocalDateKitCalculatorsFactory; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import static org.hamcrest.Matchers.equalTo; public class BizDayTest { private DateCalculator<LocalDate> dateCalculator; private final LocalDate startDate = LocalDate.of(2009, 12, 23); @Before public void setUp() { HashSet<LocalDate> holidays = new HashSet<LocalDate>(); holidays.add(LocalDate.of(2009, 12, 25)); // Friday DefaultHolidayCalendar<LocalDate> holidayCalendar = new DefaultHolidayCalendar<LocalDate>(holidays); LocalDateKitCalculatorsFactory.getDefaultInstance() .registerHolidays("example", holidayCalendar); dateCalculator = LocalDateKitCalculatorsFactory.getDefaultInstance() .getDateCalculator("example", HolidayHandlerType.FORWARD); dateCalculator.setStartDate(startDate); } @Test public void should_not_change_calendar_start_date_even_after_moving() { assertThat( dateCalculator.moveByBusinessDays(6).getStartDate(), equalTo(startDate)); } @Test public void moveByBusinessDays_will_return_24_dec_2009_as_next_business_day() { assertThat( dateCalculator.moveByBusinessDays(1).getCurrentBusinessDate(), equalTo(LocalDate.of(2009, 12, 24))); } @Test public void moveByBusinessDays_will_return_28_dec_2009_as_two_business_days_later() { assertThat( dateCalculator.moveByBusinessDays(2).getCurrentBusinessDate(), equalTo(LocalDat.of(2009, 12, 28))); } @Test public void moveByDays_will_also_return_28_dec_2009_as_two_business_days_later() { assertThat( dateCalculator.moveByDays(2).getCurrentBusinessDate(), equalTo(LocalDate.of(2009, 12, 28))); } @Test public void moveByBusinessDays_will_exclude_25_26_and_27_dec_when_computing_business_days() { assertThat( dateCalculator.moveByBusinessDays(5).getCurrentBusinessDate(), equalTo(LocalDate.of(2009, 12, 31))); } @Test public void moveByDays_will_include_25_26_and_27_dec_when_computing_business_days() { assertThat( dateCalculator.moveByDays(5).getCurrentBusinessDate(), equalTo(LocalDate.of(2009, 12, 28))); } }
库默认的工作周,从周一到周五,但你可以通过提供一个自定义更改默认设置WorkingWeek来DateCalculator的setWorkingWeek()。
WorkingWeek
DateCalculator
setWorkingWeek()
如最后两个示例所示,moveByDays()在移动日期时moveByBusinessDays()包括周末,而排除周末。
moveByDays()
moveByBusinessDays()
该库还允许您使用java.util.Calendar或Joda Time的LocalDate。这些示例使用JDK8,java.time.LocalDate因为这是自JDK8以来的首选方法。
java.util.Calendar
LocalDate
java.time.LocalDate
编辑:更新了示例以供使用java.time.LocalDate