Java计算工作日的工具类

java

  有时候需要根据工作日计算指定的日期,也就是需要排除周六日。

1.  初版代码如下:

package cn.xm.exam.utils;

import java.util.Calendar;

import java.util.Date;

import org.apache.commons.lang.time.DateFormatUtils;

public class WorkDayCalculateUtils {

public static void main(String[] args) {

Date date = getDate(new Date(), -7);

System.out.println(DateFormatUtils.format(date, "yyyy-MM-dd"));

}

public static Date getDate(Date currentDate, int days) {

if (days == 0) {

return currentDate;

}

Calendar calendar = Calendar.getInstance();

calendar.setTime(currentDate);

int step = days < 0 ? -1 : 1;

int i = 0;

int daysAbs = Math.abs(days);

while (i < daysAbs) {

calendar.add(Calendar.DATE, step);

i++;

if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY

|| calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {

i--;

}

}

return calendar.getTime();

}

}

结果:

2019-08-14

日历如下:

2.  排除特殊工作日和休息日

  上面是按照所有的周一到周五休息、周六到周日工作来计算的,但是遇到国家法定节假日也需要进行特殊对待。

package cn.xm.exam.utils;

import java.text.ParseException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.List;

import org.apache.commons.lang.time.DateFormatUtils;

import org.apache.commons.lang3.time.DateUtils;

public class WorkDayCalculateUtils {

/**

* 特殊的工作日(星期六、日工作)

*/

private static final List<String> SPECIAL_WORK_DAYS = new ArrayList<>();

/**

* 特殊的休息日(星期一到五休息)

*/

private static final List<String> SPECIAL_REST_DAYS = new ArrayList<>();

static {

initSpecialDays();

}

public static Date getDate(Date currentDate, int days) {

if (days == 0) {

return currentDate;

}

Calendar calendar = Calendar.getInstance();

calendar.setTime(currentDate);

int step = days < 0 ? -1 : 1;

int i = 0;

int daysAbs = Math.abs(days);

while (i < daysAbs) {

calendar.add(Calendar.DATE, step);

i++;

if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY

|| calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {

// 周六日如果上班就算1个工作日

if (!SPECIAL_WORK_DAYS.contains(DateFormatUtils.format(calendar.getTime(), "yyyy-MM-dd"))) {

i--;

}

} else {

// 周1到周五休息就算1个休息日

if (SPECIAL_REST_DAYS.contains(DateFormatUtils.format(calendar.getTime(), "yyyy-MM-dd"))) {

i--;

}

}

}

return calendar.getTime();

}

/**

* 手工维护特殊日(因为是未知的,所以必须手工维护)

*/

private static void initSpecialDays() {

SPECIAL_WORK_DAYS.add("2019-09-29");

SPECIAL_WORK_DAYS.add("2019-10-12");

SPECIAL_REST_DAYS.add("2019-10-01");

SPECIAL_REST_DAYS.add("2019-10-02");

SPECIAL_REST_DAYS.add("2019-10-03");

SPECIAL_REST_DAYS.add("2019-10-04");

SPECIAL_REST_DAYS.add("2019-10-07");

}

public static void main(String[] args) throws ParseException {

Date date = getDate(DateUtils.parseDate("2019-10-01", "yyyy-MM-dd"), 6);

System.out.println(DateFormatUtils.format(date, "yyyy-MM-dd"));

}

}

结果:

2019-10-14

日历:

   注意:上面的SPECIAL_WORK_DAYS、SPECIAL_REST_DAYS需要手工进行维护,这两个集合的数据来源可以的properties配置文件、xml文件或者数据库,建议采用properties配置文件进行配置,之后读取配置文件进行字符串切割。

以上是 Java计算工作日的工具类 的全部内容, 来源链接: utcz.com/z/391039.html

回到顶部