• java处理时间-去除节假日以及双休日



    有些场景需要计算数据非工作日的情况,eg:统计每个人每月工作日签到情况等,就需要去除法定节假日和工作日,可以新建一个表用来存储和维护这些非工作日。

    一、建表:activity_holiday_info

    CREATE TABLE `activity_holiday_info` (
      `holiday_id` int NOT NULL AUTO_INCREMENT,
      `holiday_name` varchar(20) DEFAULT NULL COMMENT '节假日名称',
      `holiday_time` date DEFAULT NULL COMMENT '节假日时间',
      `remark` varchar(50) DEFAULT NULL COMMENT '备注',
      PRIMARY KEY (`holiday_id`)
    ) ENGINE=InnoDB  COMMENT='节假日';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二、java代码

    • 可以先按照年月初始化周末数据入库 initHolidays();
    • 按照年份查询已录入系统的非工作日给前端,标记在日历📅中回显展示,供运营人员查看和修改 queryHolidays()。
    • 特殊节假日带官方发布该年份后,人工从前端日历控件去修改维护 mergeHolidays()。

    1、ActivitityHolidayController.java

    /**
     * @author qy
     * 非工作日维护
     */
    @RestController
    @RequestMapping("/holidays")
    @Slf4j
    @Api(tags = "非工作日维护")
    public class ActivitityHolidayController {
    
        @Autowired
        private ActivityHolidayInfoService activityHolidayInfoService;
    
        /**
         * 非工作日维护,周六周日按年份需初始化,特殊、节假日页面维护
         */
        @ApiOperation(value = "按年份初始化周末")
        @GetMapping(value = "/{year}/initDate")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "year", dataType = "String", paramType = "path")
        })
        public Result<Boolean> initHolidays(@PathVariable String year) {
            activityHolidayInfoService.initHolidays(year);
            return Result.success(Boolean.TRUE);
        }
    
    
        /**
         * 查询已录入系统的非工作日给前端,标记在日历📅中展示。
         */
        @ApiOperation(value = "查询已录入系统的非工作日")
        @GetMapping(value = "/{year}/list")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "year", dataType = "String", paramType = "path")
        })
        public Result<List<ActivityHolidayInfo>> queryHolidays(@PathVariable String year) {
            return Result.success(activityHolidayInfoService.queryHolidays(year));
        }
    
        /**
         * 更新该年份的非工作日()
         */
        @ApiOperation(value = "更新该年份的非工作日")
        @PutMapping(value = "/{year}/list")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "year", dataType = "String", paramType = "path")
        })
        public Result<Boolean> mergeHolidays(@RequestBody List<ActivityHolidayInfo> holidayInfos, @PathVariable String year) {
            activityHolidayInfoService.mergeHolidays(holidayInfos, year);
            return Result.success(Boolean.TRUE);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    2、ActivityHolidayInfoService.java

    public interface ActivityHolidayInfoService extends IService<ActivityHolidayInfo> {
    
        /**
         * 初始化当年周六、周末
         */
        void initHolidays(String year);
    
        /**
         * 查询已录入系统的非工作日
         */
        List<ActivityHolidayInfo> queryHolidays(String year);
    
        /**
         * 更新该年份的非工作日
         */
        void mergeHolidays(List<ActivityHolidayInfo> holidayInfos, String year);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、ActivityHolidayInfoServiceImpl.java

    
    @Service
    public class ActivityHolidayInfoServiceImpl extends ServiceImpl<ActivityHolidayInfoMapper, ActivityHolidayInfo> implements ActivityHolidayInfoService {
    
        /**
         * 查询改年份已录入系统的非工作日
         */
        @Override
        public List<ActivityHolidayInfo> queryHolidays(String year) {
            QueryWrapper<ActivityHolidayInfo> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().likeRight(ActivityHolidayInfo::getHolidayTime, year);
            return baseMapper.selectList(queryWrapper);
        }
    
        /**
         * 更新该年份的非工作日
         */
        @Override
        public void mergeHolidays(List<ActivityHolidayInfo> holidayInfos, String year) {
            remove(new QueryWrapper<ActivityHolidayInfo>()
                    .lambda()
                    .likeRight(ActivityHolidayInfo::getHolidayTime, year));
            saveBatch(holidayInfos);
        }
    
        // 根据年份和月份获取当月的所有日期
        public static List<String> getDayByMonth(int month, String year) {
            List<String> data = new ArrayList<>();
            try {
                Calendar c = Calendar.getInstance();
                // 获取当前的年份
                // int year = c.get(Calendar.YEAR);
                // 获取本月的总天数
                int dayCount = c.getActualMaximum(Calendar.DAY_OF_MONTH);
                // 定义时间格式
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                // 开始日期为当前年月拼接1号
                Date startDate = sdf.parse(year + "-" + month + "-01");
                // 结束日期为当前年月拼接该月最大天数
                Date endDate = sdf.parse(year + "-" + month + "-" + dayCount);
                // 设置calendar的开始日期
                c.setTime(startDate);
                // 当前时间小于等于设定的结束时间
                while (c.getTime().compareTo(endDate) <= 0) {
                    String time = sdf.format(c.getTime());
                    data.add(time);
                    // 当前日期加1
                    c.add(Calendar.DATE, 1);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return data;
        }
    
        /**
         * 初始化当年周六、周末
         */
        @Override
        public   void initHolidays(String year) {
            try {
                // 拿到当年中的所有日期
                List<String> dateList = new ArrayList<>();
                for (int i = 1; i <= 12; i++) {
                    dateList.addAll(getDayByMonth(i, year));
                }
                dateList = dateList.stream().distinct().collect(Collectors.toList());
                // set 日期
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                List<ActivityHolidayInfo> activityHolidayInfo = new ArrayList<>();
                // 添加当年所有日期数据
                for (String date : dateList) {
                    ActivityHolidayInfo serviceDate = new ActivityHolidayInfo();
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(simpleDateFormat.parse(date));
                    // index 值为 7 时 是周六  值为 1 时是末, 美国周六是一周的最后一天,周日是一周的最后一天
                    int index = calendar.get(Calendar.DAY_OF_WEEK);
                    if (index == 7) {
                        serviceDate.setHolidayName("周六");
                        serviceDate.setRemark("周末");
                        serviceDate.setHolidayTime(simpleDateFormat.parse(date));
                        activityHolidayInfo.add(serviceDate);
                    } else if (index == 1) {
                        serviceDate.setHolidayName("周日");
                        serviceDate.setRemark("周末");
                        serviceDate.setHolidayTime(simpleDateFormat.parse(date));
                        activityHolidayInfo.add(serviceDate);
                    }
                }
               if (!CollectionUtils.isEmpty(activityHolidayInfo)) {
                   //先删除该年份数据
                    remove(new QueryWrapper<ActivityHolidayInfo>()
                            .lambda()
                            .likeRight(ActivityHolidayInfo::getHolidayTime, year));
                   //再批量插入
                    saveBatch(activityHolidayInfo);
                }
            } catch (Exception e) {
                log.error("日期初始化错误");
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    三、测试效果

    postman请求:http://x.x.x.x:8080/holidays/年份/initDate

    数据库情况:

    在这里插入图片描述

  • 相关阅读:
    通过滑动窗口实现接口调用的多种限制策略
    Java面试题总结 - Java集合篇(附答案)
    ubuntu 安装jdk8
    【每日随笔】毕业论文答辩 ① ( 答辩流程梳理 | 答辩的一些注意点 )
    xxe漏洞——无回显(ctfshow web374——378)
    让 sdk 包静默升级的 SAO 操作,你见过几种?
    Python 编程基础 | 第五章-类与对象 | 5.4、访问控制
    SpringBoot 中使用JPA
    如何做一个知识博主? 善用互联网检索
    二、JavaScript基本语法:var、let、const、数据类型、运算符、类型转换
  • 原文地址:https://blog.csdn.net/weixin_47061482/article/details/133775450