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

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计算工作日的工具类的更多相关文章

  1. Java日期时间实用工具类

    Java日期时间实用工具类 1.Date (java.util.Date)    Date();        以当前时间构造一个Date对象    Date(long);        构造函数   ...

  2. Redis 工具类 java 实现的redis 工具类

    最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...

  3. 简化bigdecimal计算的小工具类

    简化bigdecimal计算的小工具类 如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果( ...

  4. 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!

    转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...

  5. Java线程的并发工具类

    Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...

  6. Rhino+envjs-1.2.js 在java运行网站js 工具类

    java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...

  7. java中常用的工具类(一)

    我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...

  8. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  9. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

随机推荐

  1. 用jTessBoxEditorFX训练字库

    软件下载:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/ 官方字库下载:https://github.com/tesser ...

  2. Kaldi语音识别快速入门

    一.简介 Kaldi是使用C++编写的语音识别工具包,Apache License v2.0许可.主要供语音识别研究人员使用.Kaldi的目标和范围与HTK类似.目标是拥有易于修改和扩展的现代而灵活的 ...

  3. MySQL修炼之路二

    1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...

  4. 使用Deployment控制器创建Pods并使Service发布到外网可访问

    由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...

  5. python测试开发django-72.删除表后如何重新生成表

    前言 在使用ORM建表的时候,由于需要对数据库表的重新设计,需要删除原表,并通过Django的ORM功能重新同步表. 删除表之后,发现用 makemigrations 和 migrate 无法生成新的 ...

  6. 解决samba共享虚拟机第二块磁盘的难题

    linux下使用samba共享文件到window下已经实现过了   点此链接 但是共享时磁盘空间是有限的,如果空间使用完了该怎么处理呢?这是个头疼的问题,不知道samba支持不支持共享第二个文件夹,由 ...

  7. 张兴盼-201871010131 《面向对象程序设计(java)》第六、七周学习总结

    张兴盼-201871010131 <面向对象程序设计(java)>第六.七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...

  8. tf–idf算法解释及其python代码

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  9. 06-numpy-笔记-shape

    shape 是返回 np.mat 的形状的. 1. 作为 mat 的成员变量,a.shape 2. 作为 np 的成员函数,np.shape >>> import numpy as ...

  10. ReactiveX 学习笔记(29)使用 RxCpp(RxQt)+ Qt 进行 GUI 编程

    课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 下载 ...