java 国家法定节假日和双休日判断工具类

package com.date.dateutil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


/**
* @author  qyw
* @description  日期日历工具类
* @date Created in 21:01 2019/1/31
**/
public class ChineseCalendarUtils {

    // 法律规定的放假日期
    // 此处写死了。需要定时入库再读库,政府每年都会在12月份左右公布,无法提前预知
    // todo db数据转list,根据年份读取    
    private List<String> lawHolidays   = Arrays.asList("2017-12-30", "2017-12-31",
            "2018-01-01", "2018-02-15", "2018-02-16", "2018-02-17", "2018-02-18",
            "2018-02-19", "2018-02-20", "2018-02-21", "2018-04-05", "2018-04-06",
            "2018-04-07", "2018-04-29", "2018-04-30", "2018-05-01", "2018-06-16",
            "2018-06-17", "2018-06-18", "2018-09-22", "2018-09-23", "2018-09-24",
            "2018-10-01", "2018-10-02", "2018-10-03", "2018-10-04", "2018-10-05",
            "2018-10-06", "2018-10-07");
    // 由于放假需要额外工作的周末
    // todo db数据转list,根据年份读取
    private List<String> extraWorkdays = Arrays.asList("2018-02-11", "2018-02-24",
            "2018-04-08", "2018-04-28", "2018-09-29", "2018-09-30");

    /**
    * @author  qyw
    * @description  判断是否是法定假日
    * @date Created in 21:03 2019/1/31
    **/
    public boolean isLawHoliday(String calendar) throws Exception {
        ChineseCalendarUtils.isValidDate(calendar);
        if (lawHolidays.contains(calendar)) {
            return true;
        }
        return false;
    }

    /**
    * @author  qyw
    * @description  判断是否是周末
    * @date Created in 21:03 2019/1/31
    **/
    public boolean isWeekends(String calendar) throws Exception {
        ChineseCalendarUtils.isValidDate(calendar);
        // 先将字符串类型的日期转换为Calendar类型
        SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd");
        Date             date = sdf.parse(calendar);
        Calendar         ca   = Calendar.getInstance();
        ca.setTime(date);
        if (ca.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
                || ca.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            return true;
        }
        return false;
    }

    /**
    * @author  qyw
    * @description  判断是否是需要额外补班的周末
    * @date Created in 21:06 2019/1/31
    **/
    public boolean isExtraWorkday(String calendar) throws Exception {
        ChineseCalendarUtils.isValidDate(calendar);
        if (extraWorkdays.contains(calendar)) {
            return true;
        }
        return false;
    }

    /**
    * @author  qyw
    * @description  判断是否是休息日(包含法定节假日和不需要补班的周末)
    * @date Created in 21:06 2019/1/31
    **/
    public boolean isHoliday(String calendar) throws Exception {
        ChineseCalendarUtils.isValidDate(calendar);
        // 首先法定节假日必定是休息日
        if (this.isLawHoliday(calendar)) {
            return true;
        }
        // 排除法定节假日外的非周末必定是工作日
        if (!this.isWeekends(calendar)) {
            return false;
        }
        // 所有周末中只有非补班的才是休息日
        if (this.isExtraWorkday(calendar)) {
            return false;
        }
        return true;
    }

    /**
    * @author  qyw
    * @description  校验字符串是否为指定的日期格式,含逻辑严格校验,2007/02/30返回false
    * @date Created in 21:06 2019/1/31
    **/
    private static boolean isValidDate(String str) {
        boolean convertSuccess = true;
        // 指定日期格式为四位年/两位月份/两位日期,注意yyyy-MM-dd区分大小写;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            // 设置lenient为false.
            // 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            convertSuccess = false;
        }
        return convertSuccess;
    }


    public static void main(String[] args) throws Exception {
        String               calendar = "2018-01-32";
        ChineseCalendarUtils cc       = new ChineseCalendarUtils();
        System.out.println("输入的calendar是否是指定要求的格式:"+ChineseCalendarUtils.isValidDate(calendar));
        System.out.println("是否是法定节假日:" + cc.isLawHoliday(calendar));
        System.out.println("是否是周末:" + cc.isWeekends(calendar));
        System.out.println("是否是需要额外补班的周末:" + cc.isExtraWorkday(calendar));
        System.out.println("是否是休息日:" + cc.isHoliday(calendar));
    }
}

 

  • 20
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
以下是一个 Java 工具类,可以用来判断日期是否节假日双休日、调休日: ```java import java.time.DayOfWeek; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateUtils { private static final String[] HOLIDAYS = { "2022-01-01", // 元旦 "2022-02-01", // 春节 "2022-02-02", "2022-02-03", "2022-04-05", // 清明节 "2022-05-01", // 劳动节 "2022-06-01", // 儿童节 "2022-09-21", // 中秋节 "2022-10-01", // 国庆节 "2022-10-02", "2022-10-03", "2022-10-04", "2022-10-05", "2022-10-06", "2022-10-07" }; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static boolean isHoliday(String dateStr) { LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER); for (String holiday : HOLIDAYS) { if (dateStr.equals(holiday)) { return true; } } return false; } public static boolean isWeekend(String dateStr) { LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER); return date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY; } public static boolean isAdjustRestDay(String dateStr) { LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER); DayOfWeek dayOfWeek = date.getDayOfWeek(); if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) { LocalDate prevDate = date.minusDays(1); LocalDate nextDate = date.plusDays(1); return isHoliday(prevDate.toString()) || isHoliday(nextDate.toString()); } return false; } } ``` 在这个工具类中,我们使用了 Java 8 中的 LocalDate 类来处理日期,并使用 DayOfWeek 类来获取星期几。在 isHoliday() 方法中,我们使用一个字符串数组来存储节假日日期列表,并通过循环来判断指定日期是否节假日。在 isWeekend() 方法中,我们使用 DayOfWeek 类来判断指定日期是否为周六或周日。在 isAdjustRestDay() 方法中,我们判断指定日期是否为周一到周五的工作日,如果是,则判断前一天和后一天是否节假日来确定是否为调休日。在这个工具类中,我们还使用了 DateTimeFormatter 来格式化日期字符串。使用这个工具类非常简单,只需要调用相应的方法即可。例如: ```java public static void main(String[] args) { String dateStr = "2022-01-01"; boolean isHoliday = DateUtils.isHoliday(dateStr); boolean isWeekend = DateUtils.isWeekend(dateStr); boolean isAdjustRestDay = DateUtils.isAdjustRestDay(dateStr); System.out.println(dateStr + " 是否节假日:" + isHoliday); System.out.println(dateStr + " 是否双休日:" + isWeekend); System.out.println(dateStr + " 是否为调休日:" + isAdjustRestDay); } ``` 输出结果如下: ``` 2022-01-01 是否节假日:true 2022-01-01 是否双休日:true 2022-01-01 是否为调休日:false ``` 这个工具类可以轻松地集成到你的项目中,方便地进行日期判断
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值