package com.hisense.cis.core.util;
import com.hisense.cis.core.exception.BusinessRuntimeException;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class DateUtil {
public static final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static final SimpleDateFormat timeFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public static final SimpleDateFormat timeFormat3 = new SimpleDateFormat("HH:mm");
public static final SimpleDateFormat timeFormat4 = new SimpleDateFormat("yyyyMMdd HH:mm");
public static final SimpleDateFormat timeFormat5 = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
public static final SimpleDateFormat timeFormat6 = new SimpleDateFormat("yyyyMMddHHmmss");
public static final SimpleDateFormat timeFormat7 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMMdd");
public static final SimpleDateFormat dateFormat3 = new SimpleDateFormat("yyyy.MM.dd");
//新增日期格式 2020-08-14
public static final SimpleDateFormat dateFormat4 = new SimpleDateFormat("yyyy/MM/dd"); public static final SimpleDateFormat monthAndDayFormat = new SimpleDateFormat("MM/dd");
public static final SimpleDateFormat yearAndMonthFormat = new SimpleDateFormat("yyyy-MM");
public static final SimpleDateFormat yearAndMonthFormat2 = new SimpleDateFormat("yyyyMM");
public static final SimpleDateFormat yearFormat = new SimpleDateFormat("yyyyMM");
public static final SimpleDateFormat solrTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
public static final SimpleDateFormat onlyYearFormat = new SimpleDateFormat("yyyy");
private static final Logger log = LoggerFactory.getLogger(DateUtil.class);
/**
* 获取:从指定日期开始,相隔指定【跨度月】的,最后一天(如当前3月,跨度2个月,返回5月30号)
*
* @param startDate
* @param monthDuration
* @return
* @author caojun1@hisense.com
*/
public static Date getDuraMonthLastDay(Date startDate, int monthDuration) { if (startDate == null) {
startDate = new Date();
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(startDate);
lastDate.add(Calendar.MONTH, monthDuration + 1);// 加n个月
lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
lastDate.add(Calendar.DAY_OF_YEAR, -1);// 日期回滚一天,也就是本月最后一天
return lastDate.getTime(); }
/**
* 获取:从指定日期开始,相隔指定跨度【月】的,第一天(如当前3月,跨度2个月,返回5月1号)
*
* @param startDate
* @param monthDuration
* @return
* @author caojun1@hisense.com
*/
public static Date getDuraMonthFirstDay(Date startDate, int monthDuration) { if (startDate == null) {
startDate = new Date();
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(startDate);
lastDate.add(Calendar.MONTH, monthDuration);// 加n-1个月
lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
return lastDate.getTime(); }
/**
* 获取:从指定日期开始,相隔指定跨度【自然周】的,最后一天
*
* @param startDate
* @param weekDuration
* @return
*/
public static Date getDuraWeekLastDay(Date startDate, int weekDuration) { if (startDate == null) {
startDate = new Date();
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(startDate);
lastDate.add(Calendar.WEEK_OF_YEAR, weekDuration + 1);// 加n个周
lastDate.set(Calendar.DAY_OF_WEEK, 1);// 把日期设置为当周第一天(上周日)
return lastDate.getTime(); }
/**
* 获取:从指定日期开始,相隔指定跨度【自然周】的,第一天
*
* @param startDate
* @param weekDuration
* @return
*/
public static Date getDuraWeekFirstDay(Date startDate, int weekDuration) { if (startDate == null) {
startDate = new Date();
}
Calendar lastDate = Calendar.getInstance();
lastDate.setTime(startDate);
lastDate.add(Calendar.WEEK_OF_YEAR, weekDuration);// 加n个周
lastDate.set(Calendar.DAY_OF_WEEK, 2);// 把日期设置为当周第二天(本周一)
return lastDate.getTime(); }
/**
* 获取:本周的下一周的周一
*
* @param startDate
* @param weekDuration
* @return
*/
public static Date getNextWeekFirstDay() { //下周周一
Calendar cal = Calendar.getInstance(); cal.add(Calendar.WEEK_OF_MONTH, 1);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date monday = cal.getTime();
return monday;
}
/**
* 获取:指定【跨度月】的、连续的月(其中,date的日,同为当前日)(顺序:时间倒序)
*
* @param startDate 可空(空时,为当前日期)
* @param monthDuration 可负数(负数为前n个月)
* @return
*/
public static List<Date> getNextMonths(Date startDate, int monthDuration) { if (startDate == null) {
startDate = new Date();
}
List<Date> list = new ArrayList<Date>();
if (monthDuration > 0) {
Date d;
for (int i = 1; i < monthDuration + 1; i++) {
d = DateUtils.addMonths(startDate, i);
list.add(d);
}
} else {
Date d;
for (; monthDuration < 0; monthDuration++) {
d = DateUtils.addMonths(startDate, monthDuration);
list.add(d);
}
}
return list;
}
/**
* 获取:指定【跨度周】的、连续的所有自然周(其中,date的周,同为当前周)
*
* @param startDate 可空(空时,为当前日期)
* @param weekDuration 可负数(负数为前n个周)
* @return
*/
public static List<Date> getNextWeeks(Date startDate, int weekDuration) { if (startDate == null) {
startDate = new Date();
}
List<Date> list = new ArrayList<Date>();
int gap = 0;
if (weekDuration > 0) {
gap = 1;
} else {
gap = -1;
weekDuration = 0 - weekDuration;
}
for (int i = 0; i < weekDuration; i++) {
startDate = DateUtils.addWeeks(startDate, gap);
list.add(startDate);
}
return list;
}
/**
* monday
*
* @param dateStr format yyyymmdd
* @return
*/
public static Date getMondayDate(Long dateStr) { Calendar c = Calendar.getInstance();
try {
c.setTime(DateUtil.dateFormat2.parse(dateStr + ""));
} catch (ParseException e) {
log.error("date parse error @ " + dateStr, e);
throw new BusinessRuntimeException("日期@" + dateStr + "转为周一时 出现异常", "", e);
}
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return c.getTime();
}
/**
* sunday
*
* @param dateStr format yyyymmdd
* @return
*/
public static Date getSundayDate(Long dateStr) { Calendar c = Calendar.getInstance();
try {
c.setTime(DateUtil.dateFormat2.parse(dateStr + ""));
} catch (ParseException e) {
log.error("date parse error @ " + dateStr, e);
throw new BusinessRuntimeException("日期@" + dateStr + "转为周日时 出现异常", "", e);
}
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(Calendar.DAY_OF_WEEK, 7);
c.add(Calendar.DAY_OF_YEAR, 1);
Date sunday = c.getTime();
return sunday;
}
/**
* last day of month
*
* @param dateStr
* @return
*/
public static Date getMonthEndDate(Long dateStr) { Calendar c = Calendar.getInstance();
try {
c.setTime(DateUtil.dateFormat2.parse(dateStr + ""));
} catch (ParseException e) {
log.error("date parse error @ " + dateStr, e);
throw new BusinessRuntimeException("日期@" + dateStr + "转为周一时 出现异常", "", e);
}
c.add(Calendar.MONTH, 1);
c.set(Calendar.DAY_OF_MONTH, 1);
c.add(Calendar.DAY_OF_YEAR, -1);
Date monthEnd = c.getTime();
return monthEnd;
}
public static Date getDuraDayDate(String dateStr, int duraDays) {
Calendar c = Calendar.getInstance();
try {
c.setTime(DateUtil.dateFormat2.parse(dateStr));
} catch (ParseException e) {
log.error("date parse error @ " + dateStr, e);
throw new BusinessRuntimeException("日期@" + dateStr + "计算日期时 出现异常", "", e);
}
c.add(Calendar.DAY_OF_YEAR, duraDays);
return c.getTime();
}
public static Date getWfStartDate(Date date) {
Date cur = date == null ? new Date() : date;
try {
cur = dateFormat.parse(dateFormat.format(cur));
} catch (ParseException e) {
throw new BusinessRuntimeException("日期格式化出现异常", "");
}
Calendar curC = Calendar.getInstance();
curC.setTime(cur);
Calendar c = Calendar.getInstance();
c.setTime(cur);
c.set(Calendar.DAY_OF_WEEK, 4);
Date wensday = c.getTime();
if (c.after(curC)) {
c.add(Calendar.DAY_OF_YEAR, -7);
return c.getTime();
}
return wensday;
}
public static Date getWfEndDate(Date date) {
Date cur = date == null ? new Date() : date;
try {
cur = dateFormat.parse(dateFormat.format(cur));
} catch (ParseException e) {
throw new BusinessRuntimeException("日期格式化出现异常", "");
}
Calendar curC = Calendar.getInstance();
curC.setTime(cur);
Calendar c = Calendar.getInstance();
c.setTime(cur);
c.set(Calendar.DAY_OF_WEEK, 4);
if (c.after(curC)) {
c.add(Calendar.DAY_OF_YEAR, -1);
return c.getTime();
}
c.add(Calendar.DAY_OF_YEAR, 6);
return c.getTime();
}
public static String createDateSequence() {
Date date = new Date();
return timeFormat6.format(date);
}
public static String createDateSequence(String prefix, String suffix) {
Date date = new Date();
return prefix + timeFormat6.format(date) + suffix;
}
public static String createDateSequenceWithSuffix(String suffix) {
Date date = new Date();
return timeFormat6.format(date) + suffix;
}
public static Date getEndOfToday() {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
return c.getTime();
}
public static String getCurrentWeekMonday() {
Calendar calendar = Calendar.getInstance();
int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
calendar.add(Calendar.DAY_OF_MONTH, -1);
}
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return dateFormat2.format(calendar.getTime());
}
public static String getLastWeekMonday() {
Calendar calendar = Calendar.getInstance();
int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
calendar.add(Calendar.DAY_OF_MONTH, -1);
}
calendar.add(Calendar.DAY_OF_WEEK, -7);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return dateFormat2.format(calendar.getTime());
}
/**
* 获得指定日期
*
* @param date 指定日期
* @param i 天数 (例:1 后一天,-5 前五天)
* @return
*/
public static Date getSpecifiedDay(Date date, int i) { Calendar c = Calendar.getInstance();
c.setTime(date);
int day = c.get(Calendar.DATE);
c.set(Calendar.DATE, day + i);
return c.getTime();
}
/**
* 获取最近几个月
* */
public static List<String> getLastMonStr(String dateStr ,int num ){ Calendar c = Calendar.getInstance();
int year = Integer.parseInt(dateStr.substring(0,4));
int month = Integer.parseInt(dateStr.substring(4));
c.set(Calendar.YEAR,year);
c.set(Calendar.MONTH,month);
c.set(Calendar.DATE,1);
List<String> result = new ArrayList<>(num);
c.add(Calendar.MONTH,-num);
for(int i =0 ; i< num ; i++){
Date date = c.getTime();
result.add(DateUtil.yearFormat.format(date));
c.add(Calendar.MONTH,1);
}
return result;
}
/**
* 获取下周一时间
* @param date
* @return
*/
public static Date getNextWeekMonday(Date date) { Calendar cal = Calendar.getInstance();
cal.setTime(getThisWeekMonday(date));
cal.add(Calendar.DATE, 7);
return cal.getTime();
}
/**
* 获取这周周一
* @param date
* @return
*/
public static Date getThisWeekMonday(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); return cal.getTime();
}
/**
* 字符串转日期
* @param queryType
* @return
*/
public static Date tranDate(String queryType){ try {
Date paramsDate = new SimpleDateFormat("yyyyMMdd").parse(queryType);
return DateUtil.getNextWeekMonday(paramsDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}