计算工作日天数

news/2024/11/30 11:37:01/

如有侵权,可联系删除 

如有更好的工具,可以分享一下,谢谢了

需要引入的依赖 -> 依赖需要手动更新

http://6tail.cn/calendar/api.html

<dependency><groupId>cn.6tail</groupId><artifactId>lunar</artifactId><version>1.2.18</version>
</dependency>

日期工具需要的工具类

import lombok.Data;import java.util.List;/*** @desc 日期工具DTO* @author pengtianqi*/
@Data
public class HolidayDTO {/*** 节假日日期*/private List<String> holidaysList;/*** 调休日期*/private List<String> worksList;
}

工具代码 

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.nlf.calendar.Holiday;
import com.nlf.calendar.util.HolidayUtil;
import lombok.extern.slf4j.Slf4j;import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;/*** @author pengtianqi* @Desc 计算两个时间段的工作日数量*/
@Slf4j
public class DateUtil {/*** 周六/周天/工作日/节假日定义变量*/public static final String SATURDAY = "SATURDAY";public static final String SUNDAY = "SUNDAY";public static final String WORKIND_DAY = "工作日";public static final String HOLIDAYS = "节假日";/*** 统计两个时间段的工作日数量** @param startDate* @param endDate* @return*/public static Integer countNumber(LocalDate startDate, LocalDate endDate) {if (startDate.isAfter(endDate)) {throw new RuntimeException("公共组件-开始时间大于结束时间");}HolidayDTO holidayDTO = holidays(startDate, endDate);//节假日List<String> holidaysList = holidayDTO.getHolidaysList();//调休日List<String> worksList = holidayDTO.getWorksList();//统计工作日的日期集合List<LocalDate> countDay = new ArrayList<>();countDay = countDay(countDay, holidaysList, worksList, startDate, endDate.plusDays(1));if (CollUtil.isEmpty(countDay)) {return 0;}log.info("日期:countDay= {}", countDay);return countDay.size();}/*** 统计工作日的日期** @param countDay* @param holidaysList* @param worksList* @param startDate* @param endDate* @return*/public static List<LocalDate> countDay(List<LocalDate> countDay, List<String> holidaysList, List<String> worksList, LocalDate startDate, LocalDate endDate) {return queryDay(startDate, countDay, holidaysList, worksList, endDate);}/*** 查询是否为工作日** @param timeDay* @param countDay* @param holidaysList* @param worksList* @param endDate* @return*/public static List<LocalDate> queryDay(LocalDate timeDay, List<LocalDate> countDay, List<String> holidaysList, List<String> worksList, LocalDate endDate) {if (endDate.isEqual(timeDay)) {return countDay;} else {//获取这一天的星期String dayOfWeek = timeDay.getDayOfWeek().toString();//创建一个变量存今天是否为工作日String result = null;boolean isHolidays = SATURDAY.equals(dayOfWeek) || SUNDAY.equals(dayOfWeek);//周末是否为工作日if (isHolidays) {for (String work : worksList) {if (timeDay.toString().equals(work)) {result = WORKIND_DAY;}}}//正常周末为节假日if (StrUtil.isEmpty(result)) {if (isHolidays) {result = HOLIDAYS;}}//判断周内是否为节假日if (StrUtil.isBlank(result)) {for (String holiday : holidaysList) {if (timeDay.toString().equals(holiday)) {result = HOLIDAYS;}}}//如果前面全部没有判断上就为工作日if (StrUtil.isBlank(result)) {result = WORKIND_DAY;}if (WORKIND_DAY.equals(result)) {countDay.add(timeDay);}return queryDay(timeDay.plusDays(1), countDay, holidaysList, worksList, endDate);}}/*** 计算每年的节假日和调休日** @param startDate* @param endDate* @return*/public static HolidayDTO holidays(LocalDate startDate, LocalDate endDate) {int startDateYear = startDate.getYear();int endDateYear = endDate.getYear();//存储节假日日期List<String> holidaysList = new ArrayList<>();//存储调休日期List<String> worksList = new ArrayList<>();for (int i = startDateYear; i < endDateYear + 1; i++) {//获取节假日List<Holiday> holidays = HolidayUtil.getHolidays(startDateYear);//判断是否为为节假日for (Holiday holiday : holidays) {if (!holiday.isWork()) {holidaysList.add(holiday.getDay());} else {worksList.add(holiday.getDay());}}}HolidayDTO holidayDTO = new HolidayDTO();holidayDTO.setHolidaysList(holidaysList);holidayDTO.setWorksList(worksList);return holidayDTO;}
}

 


http://www.ppmy.cn/news/676202.html

相关文章

得出一个月有多少工作日

procedure gzr(v_nowdate in varchar2) as? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? v_firstsaturday varchar2(10);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??…

两个时间之间的有多少个工作日,有多少天,有多少天的周末

不愿说废话直接上代码 private static SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");int count 0;public static void main(String[] args) throws ParseException {String sTime "2020-12-28";String eTime "2021-02-12";List…

如何确认某日是否为工作日(休息日)

最近因为某些坏事&#xff0c;做了这么一个用来确认工作日的逻辑&#xff0c;前一阵子看到论坛上有些人也在问思路什么的&#xff0c;所以就在这里记录下 首先需要说明&#xff1a;因为这个判断只基于日期&#xff0c;未基于小时&#xff0c;所以这个判断标准不支持跨日&#…

【Oracle】获取最近工作日及前N个工作日

需求&#xff1a; 日历表 TCALENDAR_DATES&#xff0c;工作日flag‘1’&#xff0c;非工作日‘0’&#xff0c;取任一查询日期最近工作日&#xff0c;及最近工作日前n个工作日 日历表TCALENDAR_DATES样式 SELECT T.BASE_DATE, T.CAL_DAY, C.LAST_3_DAYFROM (SELECT C1.CAL_DA…

计算每个月的工作日

public static void main(String[] args) {System.out.println(countWorkDay(2018, 6)); }/*** 获取指定年月有多少个工作日&#xff09;** param year* param month* return*/ public static int countWorkDay(int year, int month) {Calendar c Calendar.getInstance();c.se…

【面试资料】Spring中用到了哪些设计模式?

面试时&#xff0c;初中级Java程序员一般都会问到的问题&#xff1a;Spring用到了哪些设计模式&#xff1f; 其实只要Spring使用得够熟练&#xff0c;回答这道题还是非常轻松的。因为Spring的命名非常规范&#xff0c;基本上从类名就可以看得出来用到了哪些设计模式。常用的有8…

腾讯云国际DDOS攻击常见哪些问题呢?

有 DDoS 攻击会通知吗&#xff1f; 在遭受 DDoS 攻击后&#xff0c;后台会进行告警通知推送。用户也可以根据需求自定义告警的阈值&#xff0c;当流量达到用户设定的警告阈值&#xff0c;将进行通知。具体操作请参考 设置安全事件通知。 服务器没有使用&#xff0c;为什么也遭遇…

战网修改服务器,使命召唤17战网锁区怎么办 战网修改登录地区方法

使命召唤17的PC版在战网发售&#xff0c;但是锁国区&#xff0c;需要玩家修改战网的登录地区才能购买游玩。下面为大家带来由“yjyj98879”分享的使命召唤17战网修改登录地区方法&#xff0c;希望能帮到大家。 战网修改登录地区方法&#xff1a; 1.打开此电脑在上方的栏内输入“…