Java 计算一段时间段内除去周六日、节假日的工作日数‘’

实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去周六周日以及节假日日期的工作日数;

注释比较多,因为怕自己忘记,写的可能比较啰嗦~;

1、前端界面简介

其他的先不考虑,主要是由前台传递到后台的假期开始时间和结束时间;

2、后台处理代码

此段直接进入正题,处理代码我封装到Utils工具类中了,因此关于接收前台时间数据、方法的调用以及参数的传递就不在细说,只提一点就是:传到工具类中的参数有三个,分别是假期开始、假期结束时间以及假期信息表的service对象~

代码部分:

package cn.com.ikdo.oa.leave.utils;

/**

* @Descript: 工作日计算

*/

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import cn.com.oa.leave.entity.OaAttendanceVacation; // 假期信息实体类

import cn.com.oa.leave.service.OaAttendanceVacationService; // 假期信息表的service对象

public class DutyDaysUtils {

@SuppressWarnings("deprecation")

public static float getDutyDays(Date startDate, Date endDate, OaAttendanceVacationService oaAttendanceService) {

/*

此处 result 的返回值及其类型是因为数据库中与之相关的数据是float类型的,因此设置成这样,

有需要的童鞋可以根据个人情况而定————设置成这样的目的是为了能存储带小数点的数字

*/

Float result = 0F;

/*

此处一定要new两个时间对象进行接收传递来的参数,否则会在之后保存请假的起止日期时

发现用户选择的起止日期和数据库中的日期不一致,原因就在于下面的代码会操作开始日期

并使其发生改变,而结束日期不会变化,但是还是都统一处理一下的好(强迫症~)

*/

Date startDates = new Date(startDate.getTime());

Date endDates = new Date(endDate.getTime());

/*

此段主要是为了达到半天请假记录的处理,比如我是6月11日上午11点开始请假,那么就相

当于我是早上请假,请假的第一天就会记为一个工作日,如果我是12点之后假期开始,

那么就是半个工作日(如果想细分就需要自己在琢磨琢磨了),结束日期与之类似,但是需

要注意的是,结束日期12点之前算是半个工作日,12点之后算是一个工作日,豫开始日期的正好相反

*/

SimpleDateFormat spf = new SimpleDateFormat("HH");

String start = spf.format(startDates);

String end = spf.format(endDates);

int s = Integer.parseInt(start);

int e = Integer.parseInt(end);

// 开始时间大于12点的按半天算,小于12的按一天算

if (s <= 12) {

result = result + 1F;

} else {

result = result + 0.5F;

}

// 结束时间大于12点的按一天算,小于12的按半天算

if (e <= 12) {

result = result + 0.5F;

} else {

result = result + 1F;

}

/*

重点问题:

下面的此段代码是为了将date类型的yyyy-MM-dd HH:mm:ss格式转为 yyyy-MM-dd,实际是转化成

yyyy-MM-dd 00:00:00

转化的原因:

时分秒参与while循环会产生bug:当起始时间的时分秒大于结束时间的时分秒时,一旦起止

时间的年月日相等就会导致while循环结束,产生少计算一次的问题;

转化方法:

通过处理将参与while循环的起止时间格式为年月日类型的:先通过date转为string类型的

yyyy-MM-dd格式,再转成date类型的即可(转化方法想过使用更简便的,但是很无奈没找

到,只能这么处理了,有更简便的童鞋可以告知一声~)

*/

DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

String dfStart = df.format(startDates);

String dfEnd = df.format(endDates);

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

try {

Date startparam = formatter.parse(dfStart);

Date endparam = formatter.parse(dfEnd);

// 每次循环的都查看计算日期是否超出结束日期

while (startparam.compareTo(endparam) <= 0) {

// 参与判断日期的星期码不等于周六且不等于周日的星期码

if (startparam.getDay() != 6 && startparam.getDay() != 0) {

// 此处需要注意,本人使用的去除节假日日期的方法是先将节假日的信息(主要

//是节日假期起止时间)放入到数据库中,然后通过循环比对参与判断的日期是否在某个节日假期时间内;

// 创建一个查询条件对象(没有此方法的可以自己手动将查询条件传递给SQL)

LambdaQueryWrapper query = Wrappers.lambdaQuery();

// 参与判断的日期大于等于节日假期的开始时间条件(OaAttendanceVacation为假期的实体对象,StartDay是假期开始时间)

query.le(OaAttendanceVacation::getStartDay, startparam);

// 参与判断的日期小于等于节日假期的开始时间条件(EndDay是假期截止时间)

query.ge(OaAttendanceVacation::getEndDay, startparam);

// 通过count方法查询是否存在符合条件的

int count = oaAttendanceService.count(query);

// 若是count仍为0,则说明没有符合条件的,进一步说就是参与判断的日期不是节假日

if (count == 0) {

// 工作日计数参数加一

result++;

}

}

// 此天判断玩完了,对当前日期进行加一操作,使其变成下一天的日期参与下一轮判断

startparam.setDate(startparam.getDate() + 1);

}

} catch (ParseException e1) {

e1.printStackTrace();

}

/*

到这里,只能说该统计的都统计了,但是还是有很多问题的,比如说:

1、若是请假信息中起止时间为同一天的话就会出现多算的问题;

2、若是请假信息中的开始、结束时间有为节假日的,也会出现多算的问题;

3、若是请假信息中的起止时间有为周六日的,也会出现多算的问题;

因此,下面就需要对请假信息中的起止时间进行梳理判断,判断起止时间是

否是在同一天,并在是和否情况下再次判断起止时间是否为节假日;

*/

// 判断起止时间是否为同一天

int isEq = 0;

// 创建接收yyyy-MM-dd格式的date类型的起止时间对象,下面会用到

Date paramS = new Date();

Date paramE = new Date();

try {

// 经转化成yyyy-MM-dd格式的Date数据(注意,dfStart,dfStart是在上面处理成string类型的起止时间)

Date startparam = formatter.parse(dfStart);

Date endparam = formatter.parse(dfStart);

// 直接比较起止时间是否相等

if (startparam.equals(endparam)) {

// 是同一天则改变isEq值

isEq++;

}

// yyyy-MM-dd格式的date类型的起止时间数据放入相应对象用于下边的使用

paramS = startparam;

paramE = endparam;

} catch (ParseException e1) {

e1.printStackTrace();

}

if (isEq == 0) {// 起止时间不在同一天的情况下

// 开始时间是否在节日假期范围内(OaAttendanceVacation、getStartDay、getEndDay均不在赘述,意思与上面一样)

LambdaQueryWrapper queryStart = Wrappers.lambdaQuery();

queryStart.ge(OaAttendanceVacation::getStartDay, paramS);

queryStart.le(OaAttendanceVacation::getEndDay, paramS);

int countStart = oaAttendanceService.count(queryStart);

// 结束时间是否在节日假期范围内

LambdaQueryWrapper queryEnd = Wrappers.lambdaQuery();

queryEnd.ge(OaAttendanceVacation::getStartDay, paramE);

queryEnd.le(OaAttendanceVacation::getEndDay, paramE);

int countEnd = oaAttendanceService.count(queryEnd);

// 判断开始时间不是周六日或节假日

if (startDates.getDay() != 6 && startDates.getDay() != 0 && countStart == 0) {

result = result - 1F;

} else {// 开始时间在周六日或节假日

if (s < 12) {

result = result - 1F;

} else {

result = result - 0.5F;

}

}

// 结束时间不是周六日或节假日

if (endDates.getDay() != 6 && endDates.getDay() != 0 && countEnd == 0) {

result = result - 1F;

} else {// 结束时间在周六日或节假日

if (e < 12) {

result = result - 0.5F;

} else {

result = result - 1F;

}

}

} else {// 起止时间在同一天的情况下

// 开始时间是否处于假期内,只需要查询开始时间或者结束时间即可

LambdaQueryWrapper queryStart = Wrappers.lambdaQuery();

queryStart.ge(OaAttendanceVacation::getStartDay, paramS);

queryStart.le(OaAttendanceVacation::getEndDay, paramS);

int countStart = oaAttendanceService.count(queryStart);

// 此天非节假日、周六日

if (startDates.getDay() != 6 && startDates.getDay() != 0 && countStart == 0) {

if (s < 12 && e < 12) {

result = result - 2F;

}

if (s < 12 && e > 12) {

result = result - 2F;

}

if (s > 12 && e > 12) {

result = result - 2F;

}

} else {// 此天为节假日、周六日

if (s < 12 && e < 12) {

result = result - 1.5F;

}

if (s < 12 && e > 12) {

result = result - 2F;

}

if (s > 12 && e > 12) {

result = result - 1.5F;

}

}

}

return result;

}

}

3、注:

星期码:从星期一到星期日的星期码是1,2,3,4,5,6,0。其实就是星期几对应的类似于索引的一个数码(星期码这个名词是我自己想的,因为觉得挺贴切的。。。还有就是不知道它真叫什么~)

getDay()方法就是获得这一天的星期码(int类型的),其功能就是用于获取传入日期的星期码的;

getDay()方法已经不被官方继续支持使用了,从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代,但是暂时还能用,有兴趣的可以换成Calendar试试;

另外,里面有几段代码使用频率比较高,有兴趣的可以封装成方法直接调用;

pass:

代码中主要是自己的思路,可能有点啰嗦,就是怕自己以后再看费劲,想着这会麻烦点,以后轻松点~

感悟:

不要对不会的代码心里排斥,多看别人的代码,勇于面对自己的弱点、问题,只有这样才能让自己进步!

《END》

java 算出下一个工作日_Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)...相关推荐

  1. Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)

    Java 计算一段时间段内除去周六日.节假日的工作日数'' 1.前端界面简介 2.后台处理代码 3.注: <END> 实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去 ...

  2. java 算出下一个工作日,Java:计算一个日期加下指定工作日数(排除周六周日和一系列节日)...

    Java:计算一个日期加上指定工作日数(排除周六周日和一系列节日) 工作时遇到的,随便写了个,欢迎高手点评: 核心代码: package www.sjjjob.com.date; import jav ...

  3. java 算出下一个工作日_如何计算JAVA中两个不同日期之间的工作日(不包括周末)?...

    我的要求是计算给定两个日期之间的天数,不包括星期六和星期日. 例: Start date - 10/09/15 and End date 18/09/15 Result: 7 日期采用DD / MM ...

  4. Java计算两个时间段内的工作日天数

    一般在OA系统中都会遇到计算员工这段时间内的工作天数. 这种有两种方式可以解决:一是调用第三方服务接口进行计算,二是自己在系统中写代码计算. 一的好处就是每年的节假日不用自己去维护直接用两个时间段就可 ...

  5. 获取下一个工作日/休息日的方法 本地基础搭建 Springboot 法定节假日/休息日/调休日 均可 不用调三方

    场景 我们在一些特殊的业务场景下,想要获取到下一个工作日,这里的工作日指正常的法定工作日(包含调休日),这个需求来源于银联的提现,银联只能在法定工作日才能体现,那么在业务代码里对提现日期必须就是工作日 ...

  6. 霸王的大陆3.29版java_你能接受Java 9的下一个版本是Java 18.3吗?

    原标题:你能接受Java 9的下一个版本是Java 18.3吗? 按照计划,Java 9 将于 9 月 21 日正式发布.还有一周时间,是不是很期待? 在 Java 9 这个重要版本之后,Java 又 ...

  7. python获取工作日_python – 获取下一个工作日的日期

    我正在检查当前日期是否是工作日,如果不是,我想获得下一个工作日.工作日是周一至周五. 这是我尝试过的: import time from datetime import date,timedelta ...

  8. 美瞳行业,跑不出下一个“完美日记”

    NEW 关注Tech逆向思维视频号 最新视频→[网红饭店接连翻车 过期食品的危害有多大?] 出品|连线Insight 文|钟微 编辑|子夜 美瞳,这个原本非常小众且被国际巨头占据的市场,从未涌现如此多 ...

  9. 金和oa:自定义表单函数计算一段时期内的工作日

    今天介绍一下在自定义表单时如何去计算两个日期之间的工作日.这是很常用的一个js函数,比如在加班中,比如在请假中... 1. 计算两个日期之间的工作日,写附加元素页面 <script langua ...

最新文章

  1. sftp工具都有哪些_色彩校正的工具都有哪些?
  2. java 代码性能优化_Java代码性能优化(四)
  3. 06 ORA系列:ORA-01741 非法的零长度标识符
  4. 用Thread实现socket多线通讯
  5. 360浏览器怎么保存网页账号密码
  6. IOS多线程任务(综述篇)
  7. Spring Boot系列教程八: Mybatis使用分页插件PageHelper
  8. Linux故障解决(4)——新安装的CentOS 系统无法上网解决方法 (未知的名称或服务)
  9. 【原】expdp参数CONTENT
  10. [文摘20071008]全国软考相关-计算机技术与软件专业资格(水平)考试
  11. JavaScript里的数组转化新方法Array.From
  12. 《数字电子技术基础》3.3 CMOS门电路(下)
  13. docker阿里云镜像加速
  14. SASS与 PASS的基本定义、适用范围以及差异
  15. windows 控制台cmd乱码的解决办法 chcp 65001
  16. STM32—TIMx输出PWM信号驱动MG996R舵机
  17. 如何将文字转换为二维码 python_用python将二维码转换成字符直接输出控制台
  18. 【教3妹学java】JVM调优有哪些工具?
  19. 都快2021年了,居然还有人不会MECE
  20. Android 天气APP(一)开发准备

热门文章

  1. (doc, docx)文档合并的三种方法
  2. 使用PyCharm安装mayavi
  3. python 白噪声检验-Python中的白噪声时间训练
  4. Python——解一元二次方程
  5. MapboxGL设置地图背景透明
  6. https证书不安全是什么原因?
  7. 正向代理与反向代理通俗版解释
  8. “代理服务器出现问题,或者地址有误”解决方案
  9. 计算机启动时 需换电池bells,关于笔记本电脑开机提示请考虑更换电池问题的解决步骤...
  10. ssd硬盘 速度慢 linux,固态硬盘速度太慢 快不起来?你或许犯了这四个SSD使用错误 (全文)...