JAVA日期工具类,简单实用、支持计算工作日、节假日和休息日
程序员文章站
2022-03-03 10:03:41
...
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(休)