package com.matrix.core.tools;
|
|
|
import java.sql.Timestamp;
|
import java.text.DateFormat;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDateTime;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 日期格式化,转换工具类
|
*
|
* @author Ron
|
* @createTime 2014.08.30
|
*/
|
public class DateUtil {
|
private final static int[] dayArr = new int[] { 20, 19, 21, 20, 21, 22, 23,
|
23, 23, 24, 23, 22 };
|
private final static String[] constellationArr = new String[] { "摩羯座",
|
"水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座",
|
"天蝎座", "射手座", "摩羯座" };
|
|
public static final String DATE_FORMAT_STS = "yyyy-MM-dd'T'HH:mm:ss";
|
|
public static final String DATE_FORMAT_ST = "yyyy-MM-dd'T'HH:mm";
|
|
public static final String HH_mm = "HH:mm";
|
|
public static final String HHmm = "HHmm";
|
|
public static final String MONTH = "yyyy-MM";
|
|
public static final String DATE_FORMAT_SS = "yyyy-MM-dd HH:mm:ss";
|
|
public static final String DATE_FORMAT_MONGO = "yyyy-MM-dd'T'HH:mm:ss.SSS";
|
|
|
|
public static final String DATE_FORMAT_MM = "yyyy-MM-dd HH:mm";
|
|
public static final String DATE_FORMAT_HH = "yyyy-MM-dd HH";
|
|
|
public static final String DATE_FORMAT_DD = "yyyy-MM-dd";
|
|
public static final String DATE_FORMAT_SPLITE_DD = "yyyy.MM.dd";
|
|
public static final String DATE_FORMAT_NO_SPLITE_DD = "yyyyMMdd";
|
|
public static final String DATE_FORMAT_MM_NO_DD = "yyyyMM";
|
|
public static final String DATE_FORMAT_NO_SPLITE_MM = "yyyyMMddHHmm";
|
|
public static final String DATE_FORMAT_NO_SPLITE_MM_HH = "yyyyMMddHH";
|
|
public static final String YEAR = "yyyy";
|
|
public static final String DATE_FORMAT_MMDD = "M月d日";
|
|
public static final String DATE_FORMAT_WEEK = "周";
|
|
public static final String DATE_TIME_MORNING = "早上";
|
|
public static final String DATE_TIME_AFTERNOON = "下午";
|
|
public static final String DATE_TIME_NIGHT = "晚上";
|
|
public static final String CENTRE_SCRIBING = "-";
|
|
public static final String MINUTE = "MINUTE";
|
|
protected static final String EMPTY = "";
|
|
protected static final String ZERO = "0";
|
|
protected static final String SPLITE_CHAR = ":";
|
// 空格不能删除
|
protected static final String START_TIME = " 00:00:00";
|
// 空格不能删除
|
protected static final String END_TIME = " 23:59:59";
|
|
protected static final int WEEK_DAYS = 7;
|
|
public static String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
|
|
protected static final String[] WEEKS = { "一", "二", "三", "四", "五", "六", "日" };
|
|
/**
|
* 返回年份
|
*
|
* @param date
|
* 日期
|
* @return 返回年份
|
*/
|
public static int getYear(Date date) {
|
|
try {
|
Calendar c = Calendar.getInstance();
|
c.setTime(date);
|
return c.get(Calendar.YEAR);
|
} catch (Exception e) {
|
}
|
|
return 0;
|
}
|
|
/**
|
* Java通过生日计算星座
|
*
|
* @param month
|
* @param day
|
* @return
|
*/
|
public static String getConstellation(int month, int day) {
|
return day < dayArr[month - 1] ? constellationArr[month - 1]
|
: constellationArr[month];
|
}
|
|
|
|
/**
|
*
|
* @Title: getNextNMinute 获取date之后N分钟的时间
|
* @Description: TODO
|
* @author:罗凯
|
* @param date
|
* @return
|
* Date 返回类型
|
* @date 2016年8月3日 下午2:48:51
|
* @throws
|
*/
|
public static Date getNextNMinute(Date date,int n){
|
return new Date(date.getTime()+(n*60*1000));
|
}
|
/**
|
* 返回月份
|
*
|
* @param date
|
* 日期
|
* @return 返回月份
|
*/
|
public static int getMonth(Date date) {
|
|
try {
|
Calendar c = Calendar.getInstance();
|
c.setTime(date);
|
return c.get(Calendar.MONTH) + 1;
|
} catch (Exception e) {
|
|
}
|
return 0;
|
}
|
|
/**
|
* 日期转字符串
|
*
|
* @param date
|
* @param format
|
* @return
|
*/
|
public static String dateToString(Date date, String format) {
|
|
if (date == null) {
|
return EMPTY;
|
}
|
DateFormat fmt = new SimpleDateFormat(format);
|
return fmt.format(date);
|
}
|
|
/**
|
* 字符串转日期
|
*
|
* @param dateStr
|
* @param format
|
* @return
|
*/
|
public static Date stringToDate(String dateStr, String format) {
|
|
DateFormat fmt = new SimpleDateFormat(format);
|
try {
|
return fmt.parse(dateStr);
|
} catch (ParseException e) {
|
|
}
|
return null;
|
}
|
|
/**
|
* 获取一个编码
|
* 获取一个当前时间并且加入了四位的随机字母
|
* @return
|
*/
|
public static String getTimeCode() {
|
return dateToString(new Date(), "yyyyMMddssSSS")+StringUtils.getRandomString(4);
|
}
|
|
/**
|
* 判断给定的日期是一周中的第几天,注意:按照中国的习惯,周日是第七天
|
*
|
* @param date
|
* @return
|
*/
|
public static int dateToWeek(Date date) {
|
|
if (date == null) {
|
return 0;
|
}
|
|
Calendar cal = Calendar.getInstance();
|
cal.setTime(date);
|
if (cal.get(Calendar.DAY_OF_WEEK) == 1) {
|
return 7;
|
} else {
|
return cal.get(Calendar.DAY_OF_WEEK) - 1;
|
}
|
}
|
|
public static String dateOfWeek(Date date) {
|
|
return DATE_FORMAT_WEEK + WEEKS[dateToWeek(date) - 1];
|
}
|
|
/**
|
* 指定时间的下一天
|
*
|
* @param date
|
* @return
|
*/
|
public static Date nextDate(Date date) {
|
|
if (date == null) {
|
return date;
|
}
|
|
Calendar cal = Calendar.getInstance();
|
try {
|
cal.setTime(date);
|
cal.add(Calendar.DATE, 1);
|
return cal.getTime();
|
} catch (Exception e) {
|
|
}
|
|
return null;
|
}
|
|
/**
|
* 指定时间的前一天
|
*
|
* @param date
|
* @return
|
*/
|
public static Date previousDate(Date date) {
|
|
if (date == null) {
|
return date;
|
}
|
|
Calendar cal = Calendar.getInstance();
|
try {
|
cal.setTime(date);
|
cal.add(Calendar.DATE, -1);
|
return cal.getTime();
|
} catch (Exception e) {
|
|
}
|
|
return null;
|
}
|
|
/**
|
* 指定时间的下N天
|
*
|
* @param date
|
* @return
|
*/
|
public static Date nextNDate(Date date, int nDay) {
|
|
if (date == null) {
|
return date;
|
}
|
|
Calendar cal = Calendar.getInstance();
|
try {
|
cal.setTime(date);
|
cal.add(Calendar.DATE, nDay);
|
return cal.getTime();
|
} catch (Exception e) {
|
|
}
|
|
return null;
|
}
|
|
/**
|
* 指定时间的前N天
|
*
|
* @param date
|
* @return
|
*/
|
public static Date previousNDate(Date date, int nDay) {
|
|
if (date == null) {
|
return date;
|
}
|
|
Calendar cal = Calendar.getInstance();
|
try {
|
cal.setTime(date);
|
cal.add(Calendar.DATE, -nDay);
|
return cal.getTime();
|
} catch (Exception e) {
|
|
}
|
|
return null;
|
}
|
|
/**
|
* 获取一天的起始时间
|
*
|
* @param date
|
* @return
|
*/
|
public static Date getStartDate(Date date) {
|
|
if (date == null) {
|
return date;
|
}
|
|
DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD);
|
String dateStr = fmt.format(date);
|
dateStr = dateStr + START_TIME;
|
fmt = new SimpleDateFormat(DATE_FORMAT_SS);
|
try {
|
return fmt.parse(dateStr);
|
} catch (ParseException e) {
|
|
}
|
|
return date;
|
}
|
|
/**
|
* 获取一天的结束时间
|
*
|
* @param date
|
* @return
|
*/
|
public static Date getEndDate(Date date) {
|
|
if (date == null) {
|
return date;
|
}
|
|
DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD);
|
String dateStr = fmt.format(date);
|
dateStr = dateStr + END_TIME;
|
fmt = new SimpleDateFormat(DATE_FORMAT_SS);
|
try {
|
return fmt.parse(dateStr);
|
} catch (ParseException e) {
|
|
}
|
|
return date;
|
}
|
|
/**
|
* currentDat是否在referenceDate日期之前
|
*
|
* @param referenceDate
|
* @param currentDat
|
* @return
|
*/
|
public static boolean isBeforeDate(Date referenceDate, Date currentDate) {
|
|
if (currentDate == null) {
|
return false;
|
}
|
if (referenceDate == null) {
|
return true;
|
}
|
return currentDate.before(referenceDate);
|
}
|
|
/**
|
* currentDat是否在referenceDate日期之后
|
*
|
* @param referenceDate
|
* @param currentDat
|
* @return
|
*/
|
public static boolean isAffterDate(Date referenceDate, Date currentDate) {
|
|
if (currentDate == null) {
|
return false;
|
}
|
if (referenceDate == null) {
|
return true;
|
}
|
return currentDate.after(referenceDate);
|
}
|
public static long getDifTimeMin(Date beginTime,Date endTime){
|
return (endTime.getTime()-beginTime.getTime())/1000/ 60;
|
}
|
public static List<Date> getFutureDay(Date date, int start,int end){
|
List<Date> dates=new ArrayList<Date>();
|
for (int i = 0; i < end-start; i++) {
|
dates.add(DateUtil.nextNDate(date,i));
|
}
|
return dates;
|
}
|
/**
|
* 字符串转日期 如果转换失败就返回一个当前时间date
|
*
|
* @param dateStr
|
* @param format
|
* @return
|
*/
|
public static Date stringToDateNew(String dateStr, String format) {
|
|
if (StringUtils.isBlank(dateStr) || StringUtils.isBlank(format)) {
|
return new Date();
|
}
|
DateFormat fmt = new SimpleDateFormat(format);
|
try {
|
return fmt.parse(dateStr);
|
} catch (ParseException e) {
|
|
}
|
return new Date();
|
}
|
/**
|
* 判断currentDate是否在startDate和endDate之间,不包括startDate和endDate
|
*
|
* @param startDate
|
* @param endDate
|
* @param currentDate
|
* @return
|
*/
|
public static boolean isDuringDate(Date startDate, Date endDate, Date currentDate) {
|
|
if (currentDate == null) {
|
return false;
|
}
|
|
if (isAffterDate(startDate, currentDate) && isBeforeDate(endDate, currentDate)) {
|
return true;
|
}
|
return false;
|
}
|
|
|
|
/**
|
* 获取startDate到endDate之间的星期day(中文星期)不包括startDate和endDate
|
*
|
* @param startDate
|
* @param endDate
|
* @param day
|
* @return
|
*/
|
public static List<Date> findDayDuringDate(Date startDate, Date endDate, int day) {
|
|
List<Date> listDate = new ArrayList<Date>();
|
int startDay = dateToWeek(startDate);
|
|
Date date = null;
|
if (startDay == day) {
|
date = nextNDate(startDate, WEEK_DAYS);
|
} else {
|
date = nextNDate(startDate, day - startDay);
|
}
|
while (isDuringDate(startDate, endDate, date)) {
|
listDate.add(date);
|
date = nextNDate(date, WEEK_DAYS);
|
}
|
|
return listDate;
|
}
|
|
|
|
/**
|
* date转换成Timestamp
|
*
|
* @param date
|
* @param format
|
* @return
|
*/
|
public static Timestamp dateToTimestamp(Date date, String format) {
|
|
if (date == null) {
|
return null;
|
}
|
|
format = DATE_FORMAT_SS;
|
|
DateFormat fmt = new SimpleDateFormat(format);
|
|
return Timestamp.valueOf(fmt.format(date));
|
}
|
|
/**
|
* 获取早中晚
|
*
|
* @param time
|
* @return
|
*/
|
public static String getDateTime(int time) {
|
|
// 早上
|
if (time == 1) {
|
return DateUtil.DATE_TIME_MORNING;
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtil.DATE_TIME_AFTERNOON;
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtil.DATE_TIME_NIGHT;
|
}
|
return null;
|
}
|
|
/**
|
* 获取早中晚的开始时间
|
*
|
* @param date
|
* @param time
|
* @return
|
*/
|
public static Date getMeetTimeStart(String date, int time) {
|
|
// 早上
|
if (time == 1) {
|
return DateUtil.stringToDate(date + " 06:00", DateUtil.DATE_FORMAT_MM);
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtil.stringToDate(date + " 13:00", DateUtil.DATE_FORMAT_MM);
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtil.stringToDate(date + " 19:00", DateUtil.DATE_FORMAT_MM);
|
}
|
return null;
|
}
|
|
/**
|
* 获取早中晚的结束时间
|
*
|
* @param date
|
* @param time
|
* @return
|
*/
|
|
public static Date getMeetTimeEnd(String date, int time) {
|
// 早上
|
if (time == 1) {
|
return DateUtil.stringToDate(date + " 13:00", DateUtil.DATE_FORMAT_MM);
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtil.stringToDate(date + " 19:00", DateUtil.DATE_FORMAT_MM);
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtil.stringToDate(date + " 23:00", DateUtil.DATE_FORMAT_MM);
|
}
|
return null;
|
}
|
|
/**
|
* 得到几天前的时间
|
*
|
* @param d
|
* @param day
|
* @return
|
*/
|
public static Timestamp getDateBefore(Date d, int day) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
/**
|
* 得到几天后的时间
|
*
|
* @param d
|
* @param day
|
* @return
|
*/
|
public static Timestamp getDateAfter(Date d, int day) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
/**
|
* 将日期类型格式化成字符串
|
*
|
* @param date
|
* @return 格式化后日期字符串
|
* @throws ParseException
|
*/
|
public static String dateFormatStr(Date date, String dateStyle) {
|
String dateStr = null;
|
if (date != null) {
|
SimpleDateFormat sdf = new SimpleDateFormat(dateStyle);
|
dateStr = sdf.format(date);
|
}
|
return dateStr;
|
}
|
|
/**
|
* 获取时间戳
|
*
|
* @return
|
*/
|
public static String getTimeMark() {
|
Calendar c = Calendar.getInstance();
|
int year = c.get(Calendar.YEAR);
|
int mouth = c.get(Calendar.MONTH);
|
int day = c.get(Calendar.DAY_OF_MONTH);
|
int hour = c.get(Calendar.HOUR_OF_DAY);
|
int minute = c.get(Calendar.MINUTE);
|
int second = c.get(Calendar.SECOND);
|
int haomiao = c.get(Calendar.MILLISECOND);
|
return "" + year + mouth + day + hour + minute + second + haomiao;
|
}
|
|
/**
|
* 获取当前时间后的几年
|
* @param d
|
* @param year
|
* @return
|
*/
|
public static Timestamp getDateAfterYear(Date d, int year) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.YEAR, now.get(Calendar.YEAR) + year);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
/**
|
* 获取当前时间后的几个月
|
* @param d
|
* @param month
|
* @return
|
*/
|
public static Timestamp getDateAfterMonth(Date d, int month) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.MONTH, now.get(Calendar.MONTH) + month);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
/**
|
* 获取当前时间后的几个小时
|
* @param d
|
* @param hours
|
* @return
|
*/
|
public static Timestamp getDateAfterHours(Date d, int hours) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.HOUR_OF_DAY, now.get(Calendar.HOUR_OF_DAY) + hours);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
public static Timestamp getDateAfterMinute(Date d, int minute) {
|
Calendar now = Calendar.getInstance();
|
now.setTime(d);
|
now.set(Calendar.MINUTE, now.get(Calendar.MINUTE) + minute);
|
return new Timestamp(now.getTime().getTime());
|
}
|
|
|
/**
|
* 计算2个时间直接的时间差
|
*/
|
public static long getTimeSpan(Date maxTime, Date startTime, String unit) {
|
long um= Math.abs(maxTime.getTime()-startTime.getTime());
|
if(MINUTE.equals(unit)){
|
um=um/(1000*60);
|
}
|
return um;
|
}
|
|
/**
|
* 根据单位计算目标日期
|
*
|
* @param num 距离
|
* @param unit 日期单位 Y/M/D
|
* @return
|
*/
|
public static Date calDate(Integer num, String unit) {
|
Calendar calendar = Calendar.getInstance();
|
Date targetDate = null;
|
switch (unit) {
|
case "Y":
|
calendar.add(Calendar.YEAR, num);
|
targetDate = calendar.getTime();
|
break;
|
case "M":
|
calendar.add(Calendar.MONTH, num);
|
targetDate = calendar.getTime();
|
break;
|
case "D":
|
calendar.add(Calendar.DAY_OF_MONTH, num);
|
targetDate = calendar.getTime();
|
break;
|
default:
|
targetDate = stringToDate("9999-12-31", DATE_FORMAT_DD);
|
|
}
|
|
return targetDate;
|
}
|
}
|