wlcb-system-task/src/main/java/cn/com/tenlion/systemtask/utils/DateUtils.java
Renpc-kilig 5a3a8a2bf3 任务下派功能新增循环任务类型的下派
完善超时任务逻辑
2021-10-30 15:15:07 +08:00

451 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"));
}
}