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计算工作日的工具类的更多相关文章
- Java日期时间实用工具类
Java日期时间实用工具类 1.Date (java.util.Date) Date(); 以当前时间构造一个Date对象 Date(long); 构造函数 ...
- Redis 工具类 java 实现的redis 工具类
最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...
- 简化bigdecimal计算的小工具类
简化bigdecimal计算的小工具类 如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果( ...
- 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!
转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...
- Java线程的并发工具类
Java线程的并发工具类. 一.fork/join 1. Fork-Join原理 在必要的情况下,将一个大任务,拆分(fork)成若干个小任务,然后再将一个个小任务的结果进行汇总(join). 适用场 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
随机推荐
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- Windows 获取进程ID
DWORD GetProcessID(const char *ProcessName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY ...
- 一、Hadoop入门概述
一.Hadoop是什么 Hadoop是一个由Apche基金会所开发的分布式系统基础架构. 主要解决海量数据的存储和海量数据的分析计算问题. 广义上来说,Hadoop通常是指一个更广泛的概念—Hadoo ...
- 5种处理Vue异常的方法
原文: Handling Errors in Vue.js 译者: Fundebug 本文采用意译,版权归原作者所有 去年一整年,我都在使用最爱的-Vue.js- 来做项目.最近突然意识到,我竟然从来 ...
- Python学习日记(四十一) Mysql数据库篇 九
前言 索引的主要作用是起到约束和加速查找,ORM框架(sqlalchemy)是用类和对象对数据库进行操作 索引的种类 按种类去分 1.普通索引:能够加速查找 2.主键索引:能够加速查找.不能为空.不能 ...
- 【Spring Cloud】Spring Cloud之自定义@SpringCloudProfile注解实现@Profile注解的功能
一.为什么会想到定义@SpringCloudProfile这样的注解 首页提一下@Profile注解:它主要用与Spring Boot多环境配置中,指定某个类只在指定环境中生效,比如swagger的配 ...
- Linux的DNS主从服务器部署
下面的部署是在Linux的DNS正向解析部署上进行修改的. 如果有什么问题或者错误,可以访问上篇帖子 下面开始有关DNS的服务部署.<DNS主从服务器> 环境描述: 192.168.196 ...
- 第一部分day1-变量、运算
变量:为了存储程序运算过程中的一些中间 结果,为了方便日后调用常量:固定不变的量,字符大写 变量的命名规则 1.字母数字下划线组成2.不能以数字开头,不能含特殊字符和空格3.不能以保留字命名4.不能以 ...
- pod install/update失败:Failed to connect to 127.0.0.1 port 1080: Connection refused
出现这类错误,通常是因为代理发生的,取消代理即可! 1.查看有无相关代理: git config --global http.proxy git config --global https.proxy ...
- Game Engine Architecture 13
[Game Engine Architecture 13] 1.describe an arbitrary signal x[n] as a linear combination of unit im ...