JAVA日期工具类,简单实用、支持计算工作日、节假日和休息日

java的日期操作一直都是比较鸡肋,用起来超麻烦的,所以我自己写了一个工具类。

点击查看代码源码
代码依赖 org.apache.commons.lang3 的包

工具类方法的使用

  • 创建时间日期
// 当前时间
DateUtil.DateTime date = DateUtil.date();
// 使用 java.util.Date 创建
Date jdkDate = new Date();
date = DateUtil.date(jdkDate);
// 用字符串创建,兼容顺序yyyy、MM、dd、HH、mm、ss的日期,可以在工具添加更多兼容格式
date = DateUtil.parseDate("2018-01-22");
date = DateUtil.parseDate("2018-01-22 10:28:30");
date = DateUtil.parseDate("20180122102830");
date = DateUtil.parseDate("20180122");
// 指定日期时间
date = DateUtil.date(2018, 01, 22);
date = DateUtil.date(2018, 01, 22, 10, 28, 30);
// 兼容原java.util.Date
Date d = date;
  • 日期运算
// 当前时间添加1天半的时间
Date date = DateUtil.date().addDays(1).addHours(12);
// 指定时间添加1天半的时间
date = DateUtil.date(2018, 1, 22).addDays(2).addHours(-12);
// 获取2月最后一天日期
date = DateUtil.date().month(2).monthLastDate();
// 获取这个月的1号日期
date = DateUtil.date().day(1);
// 获取这周星期一的日期
date = DateUtil.date().weekStart();
// 获取这周星期天的日期
date = DateUtil.date().weekEnd();
// 获取这周星期三的日期
date = DateUtil.date().weekStart().addDays(2);
  • 计算日期
// 获取2月份有多少天
int days = DateUtil.date().month(2).monthLastDate().day();
// 获取今天星期几:0-6对应星期天到星期六
int weeb = DateUtil.date().getWeek();
// 获取中文今天星期几
String weebStr = DateUtil.date().getZhWeek();

DateUtil.DateTime date1 = DateUtil.date().addDays(2);
Date date2 = new Date();
// 相差天数:2天(date1 - date2)
int diffDays = date1.compareDays(date2);
// 相差小时:48小时(date1 - date2)
int diffHours = date1.compareHours(date2);
// 相差小时:-48小时(date2 - date1)
diffHours = DateUtil.date(date2).compareHours(date1);
  • 日期比较
DateUtil.DateTime date1 = DateUtil.date().addHours(2);
Date date2 = new Date();
// 判断date1是否在date2之前,精确到小时:false
boolean result = date1.beforeOfHour(date2);
// 判断date1是否在date2之前,精确到天,不包含当天:false
result = date1.beforeOfDay(date2);

// 判断date1是否在date2之后,精确到小时:true
result = date1.afterOfHour(date2);
// 判断date1是否在date2之后,精确到天,不包含当天:false
result = date1.afterOfDay(date2);

// 判断date1和date2是否在同一个时间,精确到小时:false
result = date1.sameHour(date2);
// 判断date1和date2是否在同一天:true
result = date1.sameDay(date2);

Date date3 = DateUtil.date().addDays(1);
// 判断是否在两个日期之间,精确到小时:false
result = DateUtil.date(date2).isBetweenOfHour(date1, date3);
// 判断是否在两个日期之间,精确到天:true
result = DateUtil.date(date2).isBetweenOfDay(date1, date3);
  • 格式化字符串
Date date = new Date();
// 默认:yyyy-MM-dd HH:mm:ss
String str = DateUtil.date(date).toString();
// 指定格式
str = DateUtil.date(date).toString("yyyyMMdd HHmmss");
// 指定格式和语言
str = DateUtil.date(date).toString("yyyy-MM-dd HH:mm:ss EEE", Locale.SIMPLIFIED_CHINESE);

工作日计算

  • 全局设置节假日
List<Date> workdays= new ArrayList<>();
List<Date> holidays = new ArrayList<>();
workdays.add(DateUtil.parseDate("2018-04-28")); //五一补班
holidays.add(DateUtil.parseDate("2018-04-29")); //五一放假
holidays.add(DateUtil.parseDate("2018-04-30")); //五一放假
holidays.add(DateUtil.parseDate("2018-05-01")); //五一放假
DateUtil.workdayConfig().setWorkdays(workdays);
DateUtil.workdayConfig().setHolidays(holidays);
  • 全局设置每周的休息天
//默认周末双休
//设置周日单休
DateUtil.workdayConfig().setWeekDayOff(new Integer[]{Calendar.SUNDAY});

//设置大小周休息日
DateUtil.workdayConfig().setWeekDayOff(
                new Integer[]{Calendar.SUNDAY},     //单周只休星期天
                new Integer[]{Calendar.SATURDAY, Calendar.SUNDAY});    //双周休周末两天
  • 全局设置月的休息天
//设置5月的29、30、31号为休息天
DateUtil.workdayConfig().addMonthDayOff(5, new Integer[]{29, 30, 31});
  • 工作日计算
//日期2018-04-26五个工作日之后的日期:2018-05-04
DateUtil.parseDate("2018-04-26").addWorkdays(5);
//日期2018-05-04五个工作日之前的日期:2018-04-26
DateUtil.parseDate("2018-05-04").addWorkdays(-5);

//判断工作日
DateUtil.parseDate("2018-04-26").isWorkday();
//判断休息日
DateUtil.parseDate("2018-04-26").isDayOff();

不使用全局工作日配置

WorkdayConfig workdayConfig = DateUtil.getWorkdayConfig();
workdayConfig.addMonthDayOff(5, new Integer[]{29, 30, 31});
DateTime date = DateUtil.date(2018, 5, 1).workdayConfig(workdayConfig);
for (int i = 1; i <= 31; i++) {
    date.day(i);
    System.out.print(String.format("%s(%s)  ", date.toString("MM/dd"),
            date.day(i).isWorkday() ? "班" : "休"));
    if (i % 7 == 0) {
        System.out.println();
    }
}

输出的结果

05/01(休)  05/02(班)  05/03(班)  05/04(班)  05/05(休)  05/06(休)  05/07(班)  
05/08(班)  05/09(班)  05/10(班)  05/11(班)  05/12(休)  05/13(休)  05/14(班)  
05/15(班)  05/16(班)  05/17(班)  05/18(班)  05/19(休)  05/20(休)  05/21(班)  
05/22(班)  05/23(班)  05/24(班)  05/25(班)  05/26(休)  05/27(休)  05/28(班)  
05/29(休)  05/30(休)  05/31(休)  
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个 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 ``` 这个工具类可以轻松地集成到你的项目中,方便地进行日期判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值