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

后端 未结 14 1355
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:48

    Use:

    public Calendar addBusinessDate(Calendar cal, int numBusinessDays) {
      int numNonBusinessDays = 0;
    
      for(int i = 0; i < numBusinessDays; i++) {
        cal.add(Calendar.DATE, 1);
    
        /*
           It's a Canadian/American custom to get the Monday (sometimes Friday) off
           when a holiday falls on a weekend.
        */
        for(int j = 0; j < holidays; j++) { //holidays is list of dates
          if(cal.getTime() == (Date)holidays.get(j)) {
            numNonBusinessDays++;
          }
        }
    
        if(cal.get(Calendar.DAY_OF_WEEK) == 1 ||
           cal.get(Calendar.DAY_OF_WEEK) == 7) {
          numNonBusinessDays++;
        }
      }
    
      if(numNonBusinessDays > 0) {
        cal.add(Calendar.DATE, numNonBusinessDays);
      }
    
      return cal;
    }
    

    You'd have to populate a list of dates in order to handle holidays. There's common ones like New Years, but Thanksgiving is different between Canada & the US for instance. Also mind that holidays can fall on a weekend, so the weekend becomes a 3 day weekend.

    Reference:

    • Calendar
    • Calendar Constant Values

    PS: There isn't really a need to return the Calendar instance if you are updating the value as in the example. But it is valid if you want to create a separate Calendar instance, use:

    public Calendar addBusinessDate(Calendar cal, int numBusinessDays) {
      Calendar cal2 = Calendar.getInstance();
      cal2.setTime(cal.getTime());
    
      int numNonBusinessDays = 0;
    
      for(int i = 0; i < numBusinessDays; i++) {
        cal2.add(Calendar.DATE, 1);
    
        /*
           It's a Canadian/American custom to get the Monday (sometimes Friday) off
           when a holiday falls on a weekend.
        */
        for(int j = 0; j < holidays; j++) { //holidays is list of dates
          if(cal2.getTime() == (Date)holidays.get(j)) {
            numNonBusinessDays++;
          }
        }
    
        if(cal2.get(Calendar.DAY_OF_WEEK) == 1 ||
           cal2.get(Calendar.DAY_OF_WEEK) == 7) {
          numNonBusinessDays++;
        }
      }
    
      if(numNonBusinessDays > 0) {
        cal2.add(Calendar.DATE, numNonBusinessDays);
      }
    
      return cal2;
    }
    
    0 讨论(0)
  • 2020-12-03 02:48

    This algorithm calculates the next business date for a given date (business days are from monday to friday in my country), you can adapt it to iterate the number of days you need to add.

    public Calendar nextBusinessDate(Calendar cal) {
    
        List<Calendar> holidays = ********
        // Here get list of holidays from DB or some other service...
    
        GregorianCalendar calCp = new GregorianCalendar();
        calCp.setTime(cal.getTime());
        calCp.add(Calendar.DAY_OF_MONTH, 1);
    
        boolean isSaturday = (calCp.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY);
        boolean isSunday = (calCp.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY);
        boolean isHoliday = holidays.contains(calCp);
    
        while (isSaturday || isSunday || isHoliday) {
          if (isSaturday) {
              calCp.add(Calendar.DAY_OF_MONTH, +2); // is saturday, make it monday
            } else {
            if (isSunday) {
                calCp.add(Calendar.DAY_OF_MONTH, +1); // is sunday, make it monday
            } else {
                if (isHoliday) {
                     calCp.add(Calendar.DAY_OF_MONTH, +1); // is holiday, make it next day
                   }
                }
            }
          calCp = new GregorianCalendar();
          calCp.setTime(cal.getTime());
          isSaturday = (calCp.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY);
          isSunday = (calCp.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY);
        isHoliday = holidays.contains(calCp);
        } // end while
    
        return calCp;
    }
    
    0 讨论(0)
提交回复
热议问题