当前位置: 首页 > article >正文

SpringBoot本地判定判定工作日节假日及工作时段解决方案

SpringBoot本地判定判定工作日节假日及工作时段解决方案

文章目录

  • SpringBoot本地判定判定工作日节假日及工作时段解决方案
    • 主要思路
    • 建立数据库表,存储节假日及工作日
    • 通过代码生成增删改查Java后端代码及前端代码
    • 引入 hutool maven 依赖
    • 编写工具类,进行判定

主要思路

正常来说周一到周五为工作日,但是由于国家法定节假日规定;
如周一到周五,可能为休息日;周末可能为工作日,
这个时候就需要额外进行判定。

so:

数据库存储需额外判定的日期:工作日和节假日。
查询数据库存储的日期,进行判定

也有很多付费的公网api可调用:

拓展坞节假日接口
万年历

建立数据库表,存储节假日及工作日

CREATE TABLE `tb_extra_day` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `day_specific` date DEFAULT NULL COMMENT '日期',
  `day_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '日期类型,1工作日,0节假日',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  `create_by` bigint DEFAULT NULL COMMENT '创建者',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '禁用启用状态',
  `update_by` bigint DEFAULT NULL COMMENT '更新者',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `create_by_idx` (`create_by`) USING BTREE,
  KEY `update_by_idx` (`update_by`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT COMMENT='额外工作节假日';

通过代码生成增删改查Java后端代码及前端代码

示例存储数据

-- ----------------------------
-- Records of tb_extra_day
-- ----------------------------
INSERT INTO `tb_extra_day` VALUES (2, '2024-02-04', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (3, '2024-02-18', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (4, '2024-04-07', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (5, '2024-04-28', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (6, '2024-05-11', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (7, '2024-09-14', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (8, '2024-09-29', '1', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (9, '2024-10-12', '1', '2023-11-16 10:56:28', '2023-11-30 17:04:45', NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (10, '2024-01-01', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (11, '2024-02-12', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (12, '2024-02-13', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (13, '2024-02-14', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (14, '2024-02-15', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (15, '2024-02-16', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (16, '2024-04-04', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (17, '2024-04-05', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (18, '2024-05-01', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (19, '2024-05-02', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (20, '2024-05-03', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (21, '2024-06-10', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (22, '2024-09-16', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (23, '2024-09-17', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (24, '2024-10-01', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (25, '2024-10-02', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (26, '2024-10-03', '0', '2023-11-16 10:56:28', '2023-11-23 10:13:24', NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (27, '2024-10-04', '0', '2023-11-16 10:56:28', NULL, NULL, '0', NULL, '0', NULL);
INSERT INTO `tb_extra_day` VALUES (28, '2024-10-07', '0', '2023-11-16 10:56:28', '2023-11-23 10:11:35', NULL, '0', NULL, '0', NULL);

引入 hutool maven 依赖

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.22</version>
        </dependency>

编写工具类,进行判定

工具类返回布尔值,业务根据返回值自行处理
自行查询数据库存储的数据
可根据年份查询指定数据,提供查询效率


import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 功能描述: 判断工作日、工作时间工具类
 *
 * @author : yzd e-mail: 121665820@qq.com
 * @create : 2023/11/10 10:12
 */
@Component
public class HolidayUtil {

    /**
     * 上午 上班时间
     */
    private static final String MORNING_WORK_TIME = "9:00:00";
    /**
     * 上午 下班时间
     */
    private static final String MORNING_REST_TIME = "12:00:00";
    /**
     * 下午 上班时间
     */
    private static final String AFTERNOON_WORK_TIME = "14:00:00";

    /**
     * 下午 下班时间
     */
    private static final String AFTERNOON_REST_TIME = "18:00:00";

    /**
     * 额外节假日,需要手动录入当年放假调休的日期
     */
    private static List<String> HOLIDAY = new ArrayList<>(100);
    /**
     * 额外加班日, 需要手动录入当年额外的上班日
     */
    private static List<String> EXTRA_WORK_DAY = new ArrayList<>(100);
    /**
     * 额外日期查询服务
     */
    private static IExtraDayService iExtraDayService;

    /**
     * 初始化
     */
    @PostConstruct
    private void initialize() {
        iExtraDayService = SpringUtil.getBean(IExtraDayService.class);
    }

    /**
     * 功能描述: 判断当前日期是否为工作日 工作时间段
     *
     * @param date 日期
     * @return : java.lang.Boolean
     * @author : yzd e-mail: 121665820@qq.com
     * @create : 2023/11/10 9:26
     */
    public static Boolean isWorkingDay(Date date) {
        initDay();
        // 初始值不是工作日
        String formatDate = DateUtil.formatDate(date);
        // 是否额外节假日
        if (HOLIDAY.contains(formatDate)) {
            return Boolean.FALSE;
        }
        // 不是 额外工作日 ; 是周末
        if (!EXTRA_WORK_DAY.contains(formatDate) && DateUtil.isWeekend(date)) {
            return Boolean.FALSE;
        }

        // 今日上午 上班时间段
        DateTime morningWorkTime = DateUtil.parseDateTime(DateUtil.today() + " " + MORNING_WORK_TIME);
        DateTime morningRestTime = DateUtil.parseDateTime(DateUtil.today() + " " + MORNING_REST_TIME);
        // 今日下午 上班时间段
        DateTime afternoonWorkTime = DateUtil.parseDateTime(DateUtil.today() + " " + AFTERNOON_WORK_TIME);
        DateTime afternoonRestTime = DateUtil.parseDateTime(DateUtil.today() + " " + AFTERNOON_REST_TIME);
        // 在上午 上班时间段
        if (date.after(morningWorkTime) && date.before(morningRestTime)) {
            return Boolean.TRUE;
        }
        if (DateUtil.isSameTime(date, morningWorkTime) || DateUtil.isSameTime(date, morningRestTime)) {
            return Boolean.TRUE;
        }
        // 在下午午 上班时间段
        if (date.after(afternoonWorkTime) && date.before(afternoonRestTime)) {
            return Boolean.TRUE;
        }
        if (DateUtil.isSameTime(date, afternoonWorkTime) || DateUtil.isSameTime(date, afternoonRestTime)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    public static void main(String[] args) {
        DateTime dateTime = DateUtil.parseDateTime(DateUtil.today() + " " + "9:00:00");
        Boolean workingDay = isWorkingDay(dateTime);
        if (workingDay) {
            System.out.println("工作日,加油,打工人");
        } else {
            System.out.println("开开心心过节,高高兴兴干饭!!!");
        }
    }

    /**
     * 初始话节假日,需要手动录入当年放假调休的上班时间 初始化额外加班日,,需要手动录入当年放假调休的休息时间
     **/
    public static void initDay() {
        // 查询数据库,自行初始化常量 TODO 
    }

}

http://www.kler.cn/a/153796.html

相关文章:

  • Docker下搭建MySQL主从复制
  • 【2024秋招】2023-9-22 金山云文档服务端开发一面
  • 【spring(六)】WebSocket网络传输协议
  • 生产环境_sql获spark将课程与对应的选课人员以逗号分隔的形式存储
  • 常用装备生产ERP有哪几种?有哪些作用
  • 高级JVM
  • Java 设计模式系列:代理模式
  • 【CAN通信】AUTOSAR架构下CanTrcv休眠唤醒问题再探
  • PTA:过滤重复整数
  • Vue3 的 inject 和 provide (附源码)
  • 数据管理系统-week10-关系数据库服务器的体系结构
  • springmvc 重定向调节数据方法
  • 经验分享:JMeter控制RPS
  • 详细学习PyQt5与数据库交互
  • SQL Server 2016(在Products表中查询数据)
  • Windows端口映射/转发功能
  • 【LeetCode】栈和队列OJ题---C语言版
  • re:Invent大会,亚马逊云科技为用户提供端到端的AI服务
  • matlab操作方法(二)——基本作图
  • 景联文科技数据标注平台助力AI数据实现价值最大化