首页 > 编程语言 >Java之工作日的计算

Java之工作日的计算

时间:2022-12-09 11:36:07浏览次数:41  
标签:Java 计算 DAYS dateTime add 2022 OFF SPECIAL 工作日

业务开发中,若要求获取下一个工作日或上一个工作日,则可使用以下Java类。

package com.cmit.kapok.system.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * @Title: 计算时间周期之间工作日的时间
 * #Description: CalcWorkDaysUtil
 * #Date: 2022/6/2 14:42
 */
public class CalcWorkDaysUtil {
    private Logger logger = LoggerFactory.getLogger(CalcWorkDaysUtil.class);
    // 定义2个List用于存储特殊的工作日和非工作日
    // 特别的工作日(周六,周日上班的日期集合)
    private static List<String> SPECIAL_WORK_DAYS = new ArrayList<>();

    // 特别的休息日(周一到周五休息的日期集合)
    private static List<String> SPECIAL_OFF_DAYS = new ArrayList<>();

    // 在这里我就使用静态将2022年所有的节假日存到相应的list中
    // 大多是都是从数据库中获取的(这里就这样演示,大家后期可以从数据库获取)
    static {
        // 特殊的工作日(周六、周日上班的日期集合)
        SPECIAL_WORK_DAYS.add("2022-01-29");
        SPECIAL_WORK_DAYS.add("2022-01-30");
        SPECIAL_WORK_DAYS.add("2022-04-02");
        SPECIAL_WORK_DAYS.add("2022-04-24");
        SPECIAL_WORK_DAYS.add("2022-05-07");
        SPECIAL_WORK_DAYS.add("2022-10-08");
        SPECIAL_WORK_DAYS.add("2022-10-09");

        // 特殊的休息日(周一到周五休息的日期集合)
        SPECIAL_OFF_DAYS.add("2022-01-01");
        SPECIAL_OFF_DAYS.add("2022-01-02");
        SPECIAL_OFF_DAYS.add("2022-01-03");
        SPECIAL_OFF_DAYS.add("2022-01-31");
        SPECIAL_OFF_DAYS.add("2022-02-01");
        SPECIAL_OFF_DAYS.add("2022-02-02");
        SPECIAL_OFF_DAYS.add("2022-02-03");
        SPECIAL_OFF_DAYS.add("2022-02-04");
        SPECIAL_OFF_DAYS.add("2022-02-05");
        SPECIAL_OFF_DAYS.add("2022-02-06");
        SPECIAL_OFF_DAYS.add("2022-04-03");
        SPECIAL_OFF_DAYS.add("2022-04-04");
        SPECIAL_OFF_DAYS.add("2022-04-05");
        SPECIAL_OFF_DAYS.add("2022-04-30");
        SPECIAL_OFF_DAYS.add("2022-05-01");
        SPECIAL_OFF_DAYS.add("2022-05-02");
        SPECIAL_OFF_DAYS.add("2022-05-03");
        SPECIAL_OFF_DAYS.add("2022-05-04");
        SPECIAL_OFF_DAYS.add("2022-06-03");
        SPECIAL_OFF_DAYS.add("2022-06-04");
        SPECIAL_OFF_DAYS.add("2022-06-05");
        SPECIAL_OFF_DAYS.add("2022-09-10");
        SPECIAL_OFF_DAYS.add("2022-09-11");
        SPECIAL_OFF_DAYS.add("2022-09-12");
        SPECIAL_OFF_DAYS.add("2022-10-01");
        SPECIAL_OFF_DAYS.add("2022-10-01");
        SPECIAL_OFF_DAYS.add("2022-10-02");
        SPECIAL_OFF_DAYS.add("2022-10-03");
        SPECIAL_OFF_DAYS.add("2022-10-04");
        SPECIAL_OFF_DAYS.add("2022-10-05");
        SPECIAL_OFF_DAYS.add("2022-10-06");
        SPECIAL_OFF_DAYS.add("2022-10-07");
    }

    // 日期格式化方法(非线程安全的,可根据情况在方法内使用,或使用DateTimeFormatter)
    private static DateTimeFormatter SDF =  DateTimeFormatter.ofPattern("yyyy-MM-dd");

    private static DateTimeFormatter SDFS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static LocalDateTime nextWorkDay(LocalDateTime dateTime){
        LocalDateTime modifiedDate = dateTime.plusDays(1);
        DayOfWeek week = modifiedDate.getDayOfWeek();
        String dateStr = modifiedDate.format(SDF);
        //如果是周末,但是是特别工作日
        if((week.equals(DayOfWeek.SATURDAY) || week.equals(DayOfWeek.SUNDAY)) && SPECIAL_WORK_DAYS.contains(dateStr)){
            return modifiedDate;
        }else if(!week.equals(DayOfWeek.SATURDAY) && !week.equals(DayOfWeek.SUNDAY) && !SPECIAL_OFF_DAYS.contains(dateStr)){
            return modifiedDate;
        }else{
            return nextWorkDay(modifiedDate);
        }
    }

    public static LocalDateTime nextWorkDay(LocalDateTime dateTime,Integer num){
        if(num<1){
            return dateTime;
        }
        while(num>0){
            dateTime = nextWorkDay(dateTime);
            num--;
        }
        return dateTime ;
    }

    public static LocalDateTime lastWorkDay(LocalDateTime dateTime){
        LocalDateTime modifiedDate = dateTime.minusDays(1);
        DayOfWeek week = modifiedDate.getDayOfWeek();
        String dateStr = modifiedDate.format(SDF);
        //如果是周末,但是是特别工作日
        if((week.equals(DayOfWeek.SATURDAY) || week.equals(DayOfWeek.SUNDAY)) && SPECIAL_WORK_DAYS.contains(dateStr)){
            return modifiedDate;
        }else if(!week.equals(DayOfWeek.SATURDAY) && !week.equals(DayOfWeek.SUNDAY) && !SPECIAL_OFF_DAYS.contains(dateStr)){
            return modifiedDate;
        }else{
            return lastWorkDay(modifiedDate);
        }
    }

    public static LocalDateTime lastWorkDay(LocalDateTime dateTime,Integer num){
        if(num<1){
            return dateTime;
        }
        while(num>0){
            dateTime = lastWorkDay(dateTime);
            num--;
        }
        return dateTime ;
    }

    public static void main(String[] args) {
        LocalDateTime input = LocalDateTime.of(2022,11,28,12,12);
        LocalDateTime dateTime = lastWorkDay(input);
        System.out.println(dateTime);
    }
}

 

标签:Java,计算,DAYS,dateTime,add,2022,OFF,SPECIAL,工作日
From: https://www.cnblogs.com/luoyihao/p/16968462.html

相关文章

  • 一、Qt初尝试,做一个QT计算器《QT 入门到实战》
    学习目标了解qt的基本信息了解qt的下载及安装了解创建一个基本qt项目的流程了解信号与槽通过示例了解信号与槽的设置与编写了解控件添加的方式了解控件如何使......
  • java的特性和版本
    java的特性简单性面向对象性可移植性(跨平台性)高性能安全性健壮性多线程分布式动态性java的三个版本javaSE(标准版),主要是桌面程序开发javaME(微型版),......
  • 01.java-introduce
    OracleJava官方介绍本文章以jdk8为基础进行编写,如果想查看后续的版本可以前往jdk版本目录下查看。翻译自:https://docs.oracle.com/javase/tutorial/getStarted/intro/d......
  • Java基础-01-概述(什么是Java软件开发)
    1、何为编程?编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路......
  • Chapter12_SE负责监管计算机系统的构建
    热身问答SE是什么的缩略语?SE是SystemEngineer(系统工程师)的缩略语。在计算机系统的开发过程中,SE是参与所有开发阶段的工程师。IT是什么的缩略语?Information......
  • JavaScript入门⑨-异步编程●异世界之旅
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • 1.5.5 HDFS读写解析-hadoop-最全最完整的保姆级的java大数据学习资料
    目录1.5.5HDFS读写解析1.5.5.1HDFS读数据流程1.5.5.2HDFS写数据流程1.5.5HDFS读写解析1.5.5.1HDFS读数据流程客户端通过DistributedFileSystem向NameNode请求下......
  • Java流程控制(8)for循环
             ......
  • 云计算-CPU 并行编程-科研路-电动汽车分析
    云计算-CPU并行编程-科研路-电动汽车分析参考文献链接https://mp.weixin.qq.com/s/TSsmcW2i8so_dZ86TRKn0Ahttps://mp.weixin.qq.com/s/19vs_187sVEpW7c4L2aT5whttps:......
  • JavaScript:操作符: 逗号运算符
    逗号运算符,是极少见的运算符,我们看一下代码理解一下逗号运算符的功能:先说结论,逗号运算符的优先级非常低,比赋值运算符=还要低;同时,逗号隔开的几个表达式,都会各自进行计算,......