How can I add business days to the current date in Java?

后端 未结 14 1356
Happy的楠姐
Happy的楠姐 2020-12-03 02:05

How can I add business days to the current date in Java?

public Calendar addBusinessDate(Calendar cal, int days) {
//
// code goes over here
//
}


        
相关标签:
14条回答
  • 2020-12-03 02:42

    //supports negative numbers too.

    private Calendar addBusinessDay(final Calendar cal, final Integer numBusinessDays)
    {
        if (cal == null || numBusinessDays == null || numBusinessDays.intValue() == 0)
        {
            return cal;
        }
        final int numDays = Math.abs(numBusinessDays.intValue());
        final int dateAddition = numBusinessDays.intValue() < 0 ? -1 : 1;//if numBusinessDays is negative
        int businessDayCount = 0;
        while (businessDayCount < numDays)
        {
            cal.add(Calendar.DATE, dateAddition);
    
            //check weekend
            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
            {
                continue;//adds another day
            }
    
            //check holiday
            if (isHoliday(cal))//implement isHoliday yourself
            {
                continue;//adds another day
            }
    
            businessDayCount++;
        }
        return cal;
    }
    
    0 讨论(0)
  • 2020-12-03 02:44

    You may want to consider using ObjectLab Kit to do the heavy lifting for you.

    Assuming the requirement is simply to return the next business day when the computed date falls on a non-business day:

    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)));
        }
    }
    

    The library defaults the working week to be from Monday to Friday, but you can change the defaults by supplying a custom WorkingWeek to DateCalculator's setWorkingWeek().

    As shown in the last two examples, moveByDays() includes the weekends when moving the days, whereas moveByBusinessDays() excludes weekends.

    The library also allows you to use java.util.Calendar or Joda Time's LocalDate. The examples use JDK8's java.time.LocalDate because it is the preferred way since JDK8.

    Edit: Updated examples to use java.time.LocalDate

    0 讨论(0)
  • 2020-12-03 02:45

    This is the method I came up with:

        private Date addLaborDays(Integer days, Date date){
            Collection<Date> holidaysList = getHolidays();
    
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(Calendar.DATE, 1);
            Date dateTemp = cal.getTime();
    
            if(days == 1) return dateTemp; 
            if(holidaysList.contains(dateTemp) || DateUtil.isWeekend(dateTemp)){
                return addLaborDays(days, dateTemp);
            } else {
                return addLaborDays(days-1, dateTemp);
            }
        }
    

    Method getHolidays() queries a custom holidays database table, and method DateUtil.isWeekend(dateTemp) returns true if dateTemp is Saturday or Sunday.

    0 讨论(0)
  • 2020-12-03 02:45
    /* To Calculate 10 business days ahead of today's date
    */
    public class DueDate {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DueDate d = new DueDate();
            String dueDate = d.getDueDate(10);
            System.out.println("due Date " + dueDate);
        }
        public String getDueDate(int bday){
            Calendar cal = new GregorianCalendar();
            SimpleDateFormat fdate = new SimpleDateFormat("MM/dd/yyyy");
            while(bday > 0){
                cal.add(Calendar.DAY_OF_MONTH, 1);
                if(noWeekendsorHolidays(cal)){
                    bday--;
                }
            }
            return fdate.format(cal.getTime());
        }
    
        public boolean noWeekendsorHolidays(Calendar cal){
            int day = cal.get(Calendar.DAY_OF_WEEK);
            if(day == 1 || day == 7){
                return false;
            }
            return true;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-03 02:47

    This one works for me, short and simple:

    public static Date getBusinessDay(final Date date, final int businessDaysFromDate) {
    
    final int max = 60;
    if (date == null) {
      return getBusinessDay(new Date(), businessDaysFromDate);
    } else if (date != null && (businessDaysFromDate < 0 || businessDaysFromDate > max)) {
      return getBusinessDay(date, 0);
    } else {
      final Calendar baseDateCal = Calendar.getInstance();
      baseDateCal.setTime(date);
      for (int i = 1; i <= businessDaysFromDate; i++) {
        baseDateCal.add(Calendar.DATE, 1);
        while (baseDateCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || baseDateCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
          baseDateCal.add(Calendar.DATE, 1);
        }
      }
      return baseDateCal.getTime();
    }
    

    }

    0 讨论(0)
  • 2020-12-03 02:47

    Adding two business days to current date:

        Date today = new Date();
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(today);
    
        switch(cal1.get(Calendar.DAY_OF_WEEK)){
    
            case 1:
                    cal1.add(Calendar.DATE, 2);
                    break;
            case 2: 
                    cal1.add(Calendar.DATE, 2);
                    break;
            case 3: 
                    cal1.add(Calendar.DATE, 2);
                    break;
            case 4: 
                    cal1.add(Calendar.DATE, 2);
                    break;
            case 5: 
                    cal1.add(Calendar.DATE, 4);
                    break;
            case 6: 
                    cal1.add(Calendar.DATE, 4);
                    break;
            case 7: 
                    cal1.add(Calendar.DATE, 3);
                    break;
    
        }
    
        // You may also set the time to meet your purpose: 
        cal1.set(Calendar.HOUR_OF_DAY, 23);
        cal1.set(Calendar.MINUTE, 59);
        cal1.set(Calendar.SECOND, 59);
        cal1.set(Calendar.MILLISECOND, 00);
    
        Date twoWeekdaysAhead = cal1.getTime();
    
    0 讨论(0)
提交回复
热议问题