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
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值