Java获取2021年所有日期和节假日工作日状态

在这里插入图片描述

一、介绍

依赖

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>


<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>
        </dependency>
        <!--MP插件-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <!-- 连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.1</version>
        </dependency>
        <!--JPA-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

持久层可以用MyBatisPlus也可以用JPA。

节假日和工作日信息

在这里插入图片描述
国务院办公厅关于2021年部分节假日安排的通知
在这里插入图片描述

思路

首先设置当天日期状态是1(1为工作日、2为节假日)
判断如果当天是周六周日,日期状态设置为2;如果是国家规定的法定节假日,日期状态也设置为2;还需要把法定节假日调休的周六或者是周日的状态修改为1(例如五一、国庆节的调休)

二、代码

实体类

package com.lsh.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author :LiuShihao
 * @date :Created in 2020/12/22 3:51 下午
 * @desc :
 */
@Data
//@Builder
@TableName("mhaq_date")
public class MhaqDate {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @TableField(value = "date_str")
    private String dateStr;
    @TableField(value = "date_state")
    private Integer dateState;
    @TableField(value = "flag")
    private Integer flag;
}

Mapper

package com.lsh.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lsh.model.MhaqDate;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author :LiuShihao
 * @date :Created in 2020/12/15 2:54 下午
 * @desc :
 */
@Mapper
public interface MhaqDateMapper extends BaseMapper<MhaqDate> {}

MhaqDateService

public interface MhaqDateService {

    void insertAll();
}

MhaqDateServiceImpl

package com.lsh.service.impl;

import com.lsh.mapper.MhaqDateMapper;
import com.lsh.model.MhaqDate;
import com.lsh.service.MhaqDateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;

/**
 * @author :LiuShihao
 * @date :Created in 2020/12/22 3:55 下午
 * @desc :
 */
@Slf4j
@Transactional
@Service
public class MhaqDateServiceImpl implements MhaqDateService {
    @Autowired
    MhaqDateMapper mhaqDateMapper;

    @Override
    public void insertAll() {
        ArrayList<MhaqDate> mhaqDates = new ArrayList<>();
        LocalDateTime now = LocalDateTime.now();
        //注意 年份为小写y  否则会出错
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime firstDayOfNextYear = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.firstDayOfNextYear())), LocalTime.MIN);
        LocalDateTime lastDayOfYear = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.lastDayOfYear())), LocalTime.MAX);
        System.out.println(firstDayOfNextYear.format(pattern));
        System.out.println(lastDayOfYear.format(pattern));
        int id = 2;
        while(firstDayOfNextYear.compareTo(lastDayOfYear) == 1){
            MhaqDate mhaqDate = new MhaqDate();
            mhaqDate.setId(id);
            String format = firstDayOfNextYear.format(pattern);
//            System.out.println(format);
            mhaqDate.setDateStr(format);
            mhaqDate.setFlag(0);
            mhaqDate.setDateState(1);
            // 周六周日   state 1 为工作日   2 为节假日
            int value = firstDayOfNextYear.getDayOfWeek().getValue();
            if(value == 6 || value == 7){
                //如果是周六周日  设置为节假日
                mhaqDate.setDateState(2);
            }
            //如果是法定节假日    也设置为设置为节假日
            if ("2021-01-01".equals(format)||
                    "2021-01-02".equals(format)||
                    "2021-01-03".equals(format)||
                    "2021-02-11".equals(format)||
                    "2021-02-12".equals(format)||
                    "2021-02-13".equals(format)||
                    "2021-02-14".equals(format)||
                    "2021-02-15".equals(format)||
                    "2021-02-16".equals(format)||
                    "2021-02-17".equals(format)||
                    "2021-04-03".equals(format)||
                    "2021-04-04".equals(format)||
                    "2021-04-05".equals(format)||
                    "2021-05-01".equals(format)||
                    "2021-05-02".equals(format)||
                    "2021-05-03".equals(format)||
                    "2021-05-04".equals(format)||
                    "2021-05-05".equals(format)||
                    "2021-06-12".equals(format)||
                    "2021-06-13".equals(format)||
                    "2021-06-14".equals(format)||
                    "2021-09-19".equals(format)||
                    "2021-09-20".equals(format)||
                    "2021-09-21".equals(format)||
                    "2021-10-01".equals(format)||
                    "2021-10-02".equals(format)||
                    "2021-10-03".equals(format)||
                    "2021-10-04".equals(format)||
                    "2021-10-05".equals(format)||
                    "2021-10-06".equals(format)||
                    "2021-10-07".equals(format)){
                mhaqDate.setDateState(2);
            }
            //节假日需要周六周日调休工作日  设置为工作日
            if ("2021-02-07".equals(format)||
                    "2021-02-20".equals(format)||
                    "2021-04-25".equals(format)||
                    "2021-05-08".equals(format)||
                    "2021-09-18".equals(format)||
                    "2021-09-26".equals(format)||
                    "2021-10-09".equals(format)){

                mhaqDate.setDateState(1);
            }
            System.out.println(mhaqDate);
            mhaqDateMapper.insert(mhaqDate);
            firstDayOfNextYear = firstDayOfNextYear.plusDays(1);
            id = id+1;
        }
    }
}

对于给定的工作时间、工作日节假日,我们可以使用Java来计算出最终的截止日期时间。 首先,我们需要确定工作日节假日日期列表。可以通过读取配置文件或从数据库中获取这些日期。我们可以使用一个List或Set数据结构来保存这些日期。 接下来,我们需要确定工作日的起始时间和结束时间。假设工作日的起始时间为9:00AM(即早上9点), 结束时间为5:00PM(即下午5点)。我们可以使用Java的LocalTime类来表示时间。然后,我们可以计算出每个工作日的有效工作时间,即结束时间减去起始时间。 然后,我们需要获取给定工作时间的起始日期和时间以及所需工作的小时数。我们可以使用Java的LocalDateTime类来表示日期和时间。 接下来,我们可以根据给定的工作开始时间,将其转换为下一个最近的工作日开始时间。如果给定的工作开始时间在工作日内,则保持不变。如果给定的工作开始时间在非工作日,则将其转换为下一个最近的工作日开始时间。可以使用Java的DayOfWeek类来判断给定的日期是周几。 然后,我们需要计算剩余的工作小时数,并根据工作时间的起止时间,减去非工作时间和节假日。我们可以使用Java的Duration类来计算时间差。 最后,根据剩余的工作小时数,计算出截止日期时间。我们可以根据工作日的有效工作时间(即结束时间减去起始时间)和剩余工作小时数,确定所需的工作日数。然后,我们可以根据这个工作日数和工作时间的结束时间,计算出截止日期日期和时间。 在计算过程中,还需要考虑特殊情况,比如给定的工作时间已经超过了截止日期、工作时间跨越了多个工作日等。我们可以使用循环和条件语句来处理这些情况。 总之,通过使用Java日期时间相关的类和方法,结合计算和判断逻辑,我们可以很方便地计算出给定工作时间的最终截止日期时间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值