package cn.com.tenlion.systemtask.utils; /** * Calendar操作Date * * @author renpc */ import cn.com.tenlion.systemtask.pojo.vos.distribute.DistributeVO; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateUtils { /**设置初始值*/ private static Calendar cal; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 根据当前系统时区定义Calendar */ static { cal = Calendar.getInstance(); } /** * 通过系统当前时间和上次下派任务时间做对比 * @param rateType * @param nowTime * @param sendTime * @return * @throws ParseException */ public static boolean isOverRateType(String rateType, String nowTime, String sendTime) throws ParseException { DateRange dateRange; boolean flag = false; if("每天".equals(rateType)) { int day = compareDate(nowTime, sendTime, 0); if(day == 1) { flag = true; } } if("每周".equals(rateType)) { int day = compareDate(nowTime, sendTime, 0); if(day == 7) { flag = true; } } if("每月".equals(rateType)) { int month = compareDate(nowTime, sendTime, 1); if(month == 1) { flag = true; } } if("每季度".equals(rateType)) { int month = compareDate(nowTime, sendTime, 1); if(month == 3) { flag = true; } } if("每半年".equals(rateType)) { int month = compareDate(nowTime, sendTime, 1); if(month == 6) { flag = true; } } if("每年".equals(rateType)) { int month = compareDate(nowTime, sendTime, 1); if(month == 12) { flag = true; } } return flag; } /** * 根据日期获取半年的时间范围 * @param date * @return */ public static DateRange getHalfYearInterval(Date date) throws ParseException { DateRange dateRange = new DateRange(null, null); Calendar cal = Calendar.getInstance(); cal.setTime(date); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; if(month > 6) { cal.setTime(sdf.parse(year + "-07-01")); dateRange.setStart(cal.getTime()); cal.setTime(sdf.parse(year + "-12-31")); dateRange.setEnd(cal.getTime()); }else { cal.setTime(sdf.parse(year + "-01-01")); dateRange.setStart(cal.getTime()); cal.setTime(sdf.parse(year + "-06-30")); dateRange.setEnd(cal.getTime()); } return dateRange; } /** * 根据日期获取年的时间范围 * @param date * @return */ public static DateRange getYearInterval(Date date) throws ParseException { DateRange dateRange = new DateRange(null, null); Calendar cal = Calendar.getInstance(); cal.setTime(date); int year = cal.get(Calendar.YEAR); cal.setTime(sdf.parse(year + "-01-01")); dateRange.setStart(cal.getTime()); cal.setTime(sdf.parse(year + "-12-31")); dateRange.setEnd(cal.getTime()); return dateRange; } /** * 根据当前日期获得所在周的日期区间(周一和周日日期) * * @return * @author renpc */ public static DateRange getTimeInterval(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 得到当前日期是一个星期的第几天 if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } cal.setFirstDayOfWeek(Calendar.MONDAY); int day = cal.get(Calendar.DAY_OF_WEEK); cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); DateRange dateRange = new DateRange(cal.getTime(), null); cal.add(Calendar.DATE, 6); dateRange.setEnd(cal.getTime()); return dateRange; } /** * 比较两个日期是否相等 * @param startDate * @param endDate * @return */ public static boolean DateEqual(Date startDate, Date endDate) { String startTime = sdf.format(startDate); String endTime = sdf.format(endDate); if(startTime.equals(endTime)) { return true; }else { return false; } } /** * 获取date的月份的时间范围 * @param date * @return */ public static DateRange getMonthRange(Date date) { Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(date); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMaxTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(date); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 根据指定日期获取当前属于第几个季度 * @param date */ public static int getNowQuarter(Date date) { cal.setTime(date); int month = cal.get(Calendar.MONTH) + 1; int quarter = 0; //判断季度 if (month >= 1 && month <= 3) { quarter = 1; } else if (month >= 4 && month <= 6) { quarter = 2; } else if (month >= 7 && month <= 9) { quarter = 3; } else { quarter = 4; } return quarter; } /** * 获取当前季度的时间范围 * @return current quarter */ public static DateRange returnQuarterCurrent(int year, int quarter) { Calendar startCalendar = Calendar.getInstance(); Calendar endCalendar = Calendar.getInstance(); if (quarter == 1) { startCalendar.set(year, 1 - 1, 1, 00, 00, 00); endCalendar.set(year, 3 - 1, 31, 23, 59, 59); } else if (quarter == 2) { startCalendar.set(year, 4 - 1, 1, 00, 00, 00); endCalendar.set(year, 6 - 1, 30, 23, 59, 59); } else if (quarter == 3) { startCalendar.set(year, 7 - 1, 1, 00, 00, 00); endCalendar.set(year, 9 - 1, 30, 23, 59, 59); } else { startCalendar.set(year, 10 - 1, 1, 00, 00, 00); endCalendar.set(year, 12 - 1, 31, 23, 59, 59); } return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取当前季度的时间范围 * @return current quarter */ public static DateRange getThisQuarter() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3) * 3); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3) * 3 + 2); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取昨天的时间范围 * @return */ public static DateRange getYesterdayRange() { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.DAY_OF_MONTH, -1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.DAY_OF_MONTH, -1); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取今天的时间范围 * @return */ public static DateRange getTodayRange() { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.DAY_OF_MONTH, 0); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.DAY_OF_MONTH, 0); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取当前月份的时间范围 * @return */ public static DateRange getThisMonth() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取上个月的时间范围 * @return */ public static DateRange getLastMonth() { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.MONTH, -1); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.MONTH, -1); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取指定当前年份月的时间范围 * month:-1是前一个月,-2是前二个月。+1是推后一个月。以此类推 * @return */ public static DateRange getAppointMonth(int month) { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.MONTH, month); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.MONTH, month); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取上个季度的时间范围 * @return */ public static DateRange getLastQuarter() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * @param date1 需要比较的时间 不能为空(null),需要正确的日期格式 * @param date2 被比较的时间 为空(null)则为当前时间 * @param stype 返回值类型 0为多少天,1为多少个月,2为多少年 * @return */ public static int compareDate(String date1, String date2, int stype) { int n = 0; String[] u = {"天", "月", "年"}; String formatStyle = stype == 1 ? "yyyy-MM" : "yyyy-MM-dd"; date2 = date2 == null ? DateUtils.getCurrentDate() : date2; DateFormat df = new SimpleDateFormat(formatStyle); Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); try { c1.setTime(df.parse(date1)); c2.setTime(df.parse(date2)); } catch (Exception e3) { System.out.println("wrong occured"); } // 循环对比,直到相等,n 就是所要的结果 while (!c1.after(c2)) { n++; if (stype == 1) { // 比较月份,月份+1 c1.add(Calendar.MONTH, 1); } else { // 比较天数,日期+1 c1.add(Calendar.DATE, 1); } } n = n - 1; if (stype == 2) { n = (int) n / 365; } System.out.println(date1 + " -- " + date2 + " 相差多少" + u[stype] + ":" + n); return n; } /** * 得到当前日期 * @return */ public static String getCurrentDate() { Calendar c = Calendar.getInstance(); Date date = c.getTime(); SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd"); return simple.format(date); } private static void setMinTime(Calendar calendar) { calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); } private static void setMaxTime(Calendar calendar) { calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY)); calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE)); calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND)); calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND)); } /** * 设置日期时间为23时59分59秒 * @param calendar */ private static void setEndTime(Calendar calendar) { calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); } public final static String DEFAULT_PATTERN = "MM/dd/yyyy HH:mm:ss"; public static String format(Date date) { SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_PATTERN); return sdf.format(date); } public static boolean dateBig(String startTime, String endTime) throws ParseException { // 设置允许误差时间为五分钟 long errorTime = 5 * 60 * 1000; SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startDate = df1.parse(startTime); Date endDate = df1.parse(endTime); boolean flag = startDate.getTime() > endDate.getTime(); if(flag) { startDate = new Date(startDate.getTime() - errorTime); flag = startDate.getTime() > endDate.getTime(); } return flag; } public static void main(String[] args) throws ParseException { System.out.println(isOverRateType("每天", "2021-11-01 12:25:33", "2021-10-28 20:22:12")); } }