| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- package com.poyee.util;
- import com.alibaba.fastjson.JSONObject;
- import com.poyee.enums.DateEnums;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.StringUtils;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Objects;
- @Slf4j
- public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
- private static final String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
- private static final String[] weekDaysShort = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
- public static String YYYY_MM = "yyyy-MM";
- public static String YYYY_MM_DD = "yyyy-MM-dd";
- private static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";
- private static final String YYYY_MM_DD_HH_mm = "yyyy-MM-dd HH:mm";
- public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
- public static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS" ;
- public static String yyyyMMdd = "yyyyMMdd";
- public static String yyyyMMddHHmmss = "yyyyMMddHHmmss";
- public static String YYYY = "yyyy";
- public static String MM = "MM";
- public static String dd = "dd";
- private static JSONObject holiday = new JSONObject();
- private static String[] parsePatterns =
- {YYYY, YYYY_MM, YYYY_MM_DD, YYYY_MM_DD_HH, YYYY_MM_DD_HH_mm, YYYY_MM_DD_HH_MM_SS, "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
- public static String getWeekOfDate(Date dt) {
- String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
- Calendar cal = Calendar.getInstance();
- cal.setTime(dt);
- int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
- if (w < 0) {
- w = 0;
- }
- return weekDays[w];
- }
- /**
- * 获取年份
- */
- public static Integer getYear(Date dt) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(dt);
- return cal.get(Calendar.YEAR);
- }
- /**
- * 日期型字符串转化为日期 格式
- */
- public static Date parseDate(Object str) {
- if (str == null) {
- return null;
- }
- try {
- return parseDate(str.toString(), parsePatterns);
- } catch (ParseException e) {
- return null;
- }
- }
- /**
- * 计算两个时间之间的 指定类型 差
- *
- * @param fromDate
- * @param toDate
- * @param type`
- * @see DateEnums
- */
- public static long getDiff(Date fromDate, Date toDate, DateEnums type) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(fromDate);
- long time1 = cal.getTimeInMillis();
- cal.setTime(toDate);
- long time2 = cal.getTimeInMillis();
- long between_days = (time2 - time1) / (1000 * 3600 * 24);
- switch (type) {
- case YEAR:
- return between_days / 365;
- case MONTH:
- return between_days / 30;
- case HOUR:
- return (time2 - time1) / (1000 * 3600);
- case MINUTE:
- return (time2 - time1) / (1000 * 60);
- case SECOND:
- return (time2 - time1) / (1000);
- case DAY:
- default:
- return between_days;
- }
- }
- public static final String parseDateToStr(final String format, final Date date) {
- return new SimpleDateFormat(format).format(date);
- }
- /**
- * 获取指定工作天数后的工作日 - 以当天开始
- *
- * @param date
- * @return
- * @throws ParseException
- */
- public static Date getNumWorkDayByNow(Date date, Integer num) throws ParseException {
- //加载当前年的国家节假日
- holiday = initRedisHolidays(date);
- boolean isAfter = true;
- if(num < 0){
- num = -num;
- isAfter = false;
- }
- if (!isWeekend(date)) num = num - 1;
- for (int i = 0; i < num; i++) {
- if(isAfter){
- date = getNextWorkDay(date);
- }else{
- date = getLastWorkDay(date);
- }
- }
- return date;
- }
- /**
- * 加载节假日 从redis中
- * @param date
- * @return
- */
- private static JSONObject initRedisHolidays(Date date){
- String year = DateUtils.parseDateToStr(DateUtils.YYYY, date);
- Object redis = SpringUtils.getRedis("holiday_" + year, "hash");
- if(Objects.nonNull(redis)) {
- JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(redis));
- //判断当前时间是否 为12月 如果是12月则默认获取下年的日历
- if(Objects.equals(DateUtils.parseDateToStr(DateUtils.MM,date),"12")){
- Object nextYearRedis = SpringUtils.getRedis("holiday_" + (Integer.parseInt(year)+1),"hash");
- jsonObject.putAll(JSONObject.parseObject(JSONObject.toJSONString(nextYearRedis)));
- }
- return jsonObject;
- }
- return null;
- }
- /**
- * 是否是 休息日
- *
- * @param date
- * @return
- * @throws ParseException
- */
- public static boolean isWeekend(Date date) throws ParseException {
- //判断当前时间是否在holidays 内
- String dateTimes = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date);
- try {
- if(Objects.isNull(holiday)){
- //加载当前年的国家节假日
- holiday = initRedisHolidays(date);
- }
- String type = holiday.getString(dateTimes);
- if (StringUtils.isNotBlank(type) && Objects.equals(type, "休")) {
- return true;
- }
- //判断是否上班 如果上班则不进行 下面周六周日计算
- if (StringUtils.isNotBlank(type) && Objects.equals(type, "班")) {
- return false;
- }
- }catch (Exception e){
- log.error(" 获取 holiday error:{}", e.getMessage());
- }
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 获取当前时间的下一个工作日
- *
- * @param date
- * @return
- * @throws ParseException
- */
- public static Date getNextWorkDay(Date date) throws ParseException {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- Date nextDate = getNextDate(calendar);
- if (!isWeekend(nextDate)) {
- return nextDate;
- } else {
- return getNextWorkDay(nextDate);
- }
- }
- /**
- * 获取下一日期
- *
- * @param calendar
- * @return
- */
- public static Date getNextDate(Calendar calendar) {
- return getDateByAmount(calendar,+1);
- }/**
- * 获取下一日期
- *
- * @param calendar
- * @return
- */
- public static Date getDateByAmount(Calendar calendar ,int amount) {
- calendar.add(Calendar.DAY_OF_MONTH, amount);
- return calendar.getTime();
- }
- /**
- * 获取当前时间的下一个工作日
- *
- * @param date
- * @return
- * @throws ParseException
- */
- public static Date getLastWorkDay(Date date) throws ParseException {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- Date lastDate = getLastDate(calendar);
- if (!isWeekend(lastDate)) {
- return lastDate;
- } else {
- return getLastWorkDay(lastDate);
- }
- }
- /**
- * 获取上一日期
- * @param calendar
- * @return
- */
- public static Date getLastDate(Calendar calendar) {
- return getDateByAmount(calendar,-1);
- }
- /**
- * 获取指定时间 指定类型 的时间
- * @param type
- * @param date
- */
- public static Date getDateByType(DateEnums type, Date date, Integer num) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- switch (type) {
- case YEAR:
- calendar.add(Calendar.YEAR, num);
- break;
- case MONTH:
- calendar.add(Calendar.MONTH, num);
- break;
- case HOUR:
- calendar.add(Calendar.HOUR, num);
- break;
- case MINUTE:
- calendar.add(Calendar.MINUTE, num);
- break;
- case SECOND:
- calendar.add(Calendar.SECOND, num);
- break;
- case DAY:
- default:
- calendar.add(Calendar.DAY_OF_MONTH, num);
- break;
- }
- Date retDate = calendar.getTime();
- // System.out.println(parseDateToStr(YYYY_MM_DD_HH_MM_SS, retDate));
- return retDate;
- }
- /**
- * 获取指定时间 指定类型 的时间
- * @param type
- * @param date
- * @return
- */
- public static Date getLastDate(DateEnums type, Date date){
- Calendar calendar = Calendar.getInstance();
- String formatStr = "";
- int calendarType = Calendar.DAY_OF_MONTH;
- switch (type) {
- case YEAR:
- formatStr = YYYY;
- calendarType = Calendar.YEAR;
- break;
- case MONTH:
- formatStr = YYYY_MM;
- calendarType = Calendar.MONTH;
- break;
- case DAY:
- formatStr = YYYY_MM_DD;
- calendarType = Calendar.DAY_OF_MONTH;
- break;
- case HOUR:
- formatStr = YYYY_MM_DD_HH;
- calendarType = Calendar.HOUR;
- break;
- case MINUTE:
- formatStr = YYYY_MM_DD_HH_mm;
- calendarType = Calendar.MINUTE;
- break;
- case SECOND:
- default:
- formatStr = YYYY_MM_DD_HH_MM_SS;
- calendarType = Calendar.SECOND;
- break;
- }
- try {
- String dateStr = parseDateToStr(formatStr, date);
- Date formatDate = parseDate(dateStr, formatStr);
- calendar.setTime(formatDate);
- calendar.add(calendarType, 1);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- calendar.add(Calendar.MILLISECOND, -1);
- return calendar.getTime();
- }
- /**
- * @param date
- * @return
- */
- public static Date getWeekStartTime(Date date){
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
- calendar.set(Calendar.HOUR_OF_DAY, 0);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.SECOND, 0);
- return calendar.getTime();
- }
- public static void main(String[] args) {
- /*try {
- Date numWorkDayByNow = getNumWorkDayByNow(new Date(), -5);
- String s = parseDateToStr(YYYY_MM_DD_HH_MM_SS, numWorkDayByNow);
- log.info("numWorkDayByNow:{}", s);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }*/
- Date weekStartTime = getWeekStartTime(new Date());
- System.out.println(parseDateToStr(YYYY_MM_DD_HH_MM_SS, weekStartTime));
- System.out.println(DateUtils.parseDateToStr("yyyy-MM-01 00:00:00",new Date()));
- System.out.println(parseDateToStr(YYYY_MM_DD_HH_MM_SS, DateUtils.getLastDate(DateEnums.DAY, new Date())));
- }
- }
|