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

news2024/11/20 7:02:57

文章目录

  • 一、建表:activity_holiday_info
  • 二、java代码
    • 1、ActivitityHolidayController.java
    • 2、ActivityHolidayInfoService.java
    • 3、ActivityHolidayInfoServiceImpl.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='节假日';

二、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);
    }
}

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);
}

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();
        }
    }
}

三、测试效果

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

数据库情况:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1081442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拒绝求职诈骗,工作找好学会这一招!

马上又到了一年一季的秋招时期&#xff0c;社会险恶&#xff0c;投简历石沉大海&#xff1b;黑心企业拖欠农民工资、非法辞退或者遭受其他不公平待遇等等诸多问题。我们如何快速识别一家企业或公司值不值得入职&#xff0c;在众多竞争者中&#xff0c;脱颖而出&#xff0c;拿到…

如何选择一个向量数据库:Elastic Cloud 和 Zilliz Cloud 面面观

随着以 Milvus 为代表的向量数据库在 AI 产业界越来越受欢迎&#xff0c;诸如 Elasticsearch 之类的传统数据库和检索系统也开始行动起来&#xff0c;纷纷在快速集成专门的向量检索插件方面展开角逐。 例如&#xff0c;在提供类似插件的传统数据库中&#xff0c;Elasticsearch …

SIP对讲应用

SIP对讲应用 SIP对讲是基于标准SIP协议进行通信的对讲设备 SIP对讲一般应用到固定点位&#xff0c;进行求助报警所使用的一个设备&#xff0c;一般会应用在银行、机场、公园&#xff0c;医护对讲&#xff0c;地铁等公共场所&#xff0c;一般还分为防水型对讲终端&#xff08;…

SpringMVC源码分析(一)启动流程分析

a、SpringMVC 在启动过程中主要做了什么事情&#xff1f; SpringMVC在启动过程中是什么时候解析web.xml文件的&#xff0c;又是什么时候初始化9大内置对象的&#xff1f; <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xml…

Django实现音乐网站 ⒆

使用Python Django框架做一个音乐网站&#xff0c; 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 排行榜列表 设置路由 视图处理 模板渲染 设置跳转入口 播放器功能开发 设置路由 模板页面 脚本渲染 列表渲染和播放器实现 音乐播放器列表展示关闭 总结 排…

U3d力扣基础刷题-2

移除元素 public int RemoveElement(int[] nums, int val){// int j 0;// for (int i 0; i < nums.Length; i) // {// if (nums[i] ! val)// {// nums[j] nums[i];// }// }// return j;int j0;for(int i0;i<nums.Length;i){if(nums[i]!v…

关于导出的Excel文件的本质

上篇文章中提到关于xlsx改造冻结窗格的代码&#xff0c;我是怎么知道要加pane的呢&#xff0c;加下来就把我的心路历程记录一下。 我改造之前也是没有头绪的&#xff0c;我网上查了很多&#xff0c;只告诉我如何使用&#xff0c;但源码里没有针对!freeze的处理&#xff0c;所以…

有效回收组分含量

声明 本文是学习GB-T 42944-2023 纸、纸板和纸制品 有效回收组分的测定. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了纸、纸板和纸制品中有效回收组分的测定方法。 本文件适用于各种纸、纸板和纸制品&#xff0c;也适用于铝箔…

单目标优化算法:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解23个函数MATLAB

一、墨西哥蝾螈优化算法 墨西哥蝾螈优化算法&#xff08;Mexican Axolotl Optimization&#xff0c;MAO&#xff09;由Yenny Villuendas-Rey 1等人于2021年提出&#xff0c;该算法具有较强的平衡全局搜索与局部搜索能力。 参考文献&#xff1a; [1]Villuendas-Rey, Yenny, Jo…

Apollo源码

目录结构介绍 cyber 消息中间件&#xff0c;替换ros作为消息层 data 地图等生成好的数据放在这里&#xff08;其他数据待补充&#xff09; docker 容器相关 docs 文档相关 modules 定位&#xff0c;预测&#xff0c;感知&#xff0c;规划等自动驾驶模块 scripts 脚本 third_p…

工学云打卡签到自动实现关于异地时定位的问题解决|蘑菇钉

工学云打卡助手&#xff0c;能解决你在异地时每天不间断签到的问题&#xff0c;仔细看图哦 1.自动签到 2.自定义打卡地区 3.生成日周月报与总结自动发表 4.支持随机通用内容 5.支持打卡结果推送 你是否曾经因为缺乏自律而无法坚持学习目标&#xff1f;是否曾经因为无法衡量…

WorkPlus一站式解决方案,助力企业构建统一门户系统

在信息爆炸的时代&#xff0c;企业管理面临着海量的数据和各类业务应用的复杂性。如何实现信息的井然有序、高效管理&#xff0c;成为企业发展的关键。WorkPlus作为领先的品牌&#xff0c;致力于打造统一门户系统&#xff0c;为企业提供全方位的服务和解决方案。本文将以知乎的…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…

使用PyTorch处理多维特征输入的完美指南

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

WorkPlus私有部署即时通信助力企业信息安全与高效协作

在当今快速发展的商业环境中&#xff0c;高效的内部沟通对企业的成功至关重要。然而&#xff0c;在保障信息安全的同时&#xff0c;如何实现高效的协作和沟通一直是企业所面临的挑战。传统的公共即时通信平台&#xff0c;尽管提供了便利的沟通工具&#xff0c;但其数据存储和控…

python- excel 创建/写入/删sheet+花式遍历

文章目录 前言python- excel 创建/写入/删sheet花式遍历1. excel 创建2. 写入excel3. 创建写入excel demo实战4. 删除sheet5. excel 花式遍历 demo实战5.1. 获取 A1的值5.2. 获取指定列的切片数据&#xff0c;获取 B1到B5的值5.3. 循环整个excel的这个sheet5.4. 遍历指定行&…

VR全景云端看车,让你享受不一样的购车体验

这个“黄金周”可谓是热闹非凡&#xff0c;不仅房企大降价&#xff0c;部分车企也在“黄金周”发力&#xff0c;降价优惠促销量&#xff0c;那么你准备买车了吗&#xff1f;买车也是一个大件&#xff0c;需要多家店去走动比对价位&#xff0c;难免会挑花了眼&#xff0c;其实我…

中国SaaS行业等待“渡劫时刻”

期待、追捧、失望、质疑&#xff0c;中国SaaS行业激荡十几年&#xff0c;尝遍了市场浮沉&#xff0c;如今潮水褪去&#xff0c;SaaS企业们到了见真章的时刻。 一开始&#xff0c;SaaS行业被人们寄予厚望。互联网的蓬勃发展&#xff0c;数字化转型的历史进程&#xff0c;似乎都…

快讯|Tubi 有 Rabbit AI 啦

在每月一期的 Tubi 快讯中&#xff0c;你将全面及时地获取 Tubi 最新发展动态&#xff0c;欢迎星标关注【比图科技】微信公众号&#xff0c;一起成长变强&#xff01; Tubi 推出 Rabbit AI 帮助用户找到喜欢的视频内容 Tubi 于今年九月底推出了 Rabbit AI&#xff0c;这是一项…

基于 gin框架搭建入门项目

go mod init gin-ranking go: creating new go.mod: module gin-ranking go: to add module requirements and sums:go mod tidy下载gin框架 cmd窗口中执行命令&#xff1a; go get -u github.com/gin-gonic/ginpackage mainimport ("github.com/gin-gonic/gin"&qu…