package com.matrix.system.hive.plugin.util;
|
|
import com.matrix.core.tools.StringUtils;
|
import org.apache.log4j.Logger;
|
|
import java.sql.Timestamp;
|
import java.text.DateFormat;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 日期格式化,转换工具类
|
*
|
* @author Ron
|
* @createTime 2014.08.30
|
*/
|
public class DateUtils {
|
|
public static Logger log = Logger.getLogger(DateUtils.class);
|
|
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_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 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_YYYY_MM = "yyyy-MM";
|
|
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 DATE_FORMAT_YEAR_MONTH_DAY = "yyyy年MM月dd日";
|
|
public static final String DATE_FORMAT_MM_DD = "MM-dd";
|
|
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 = "-";
|
|
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";
|
|
public static final String HH_mm = "HH:mm";
|
public static final String HHmm = "HHmm";
|
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) {
|
log.error(e.getLocalizedMessage(), e);
|
}
|
|
return 0;
|
}
|
|
/**
|
* 返回月份
|
*
|
* @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) {
|
log.error(e.getLocalizedMessage(), 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) {
|
|
if (StringUtils.isBlank(dateStr) || StringUtils.isBlank(format)) {
|
return null;
|
}
|
DateFormat fmt = new SimpleDateFormat(format);
|
try {
|
return fmt.parse(dateStr);
|
} catch (ParseException e) {
|
log.error(e.getLocalizedMessage(), e);
|
}
|
return null;
|
}
|
|
/**
|
* 字符串转日期 如果转换失败就返回一个当前时间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) {
|
log.error(e.getLocalizedMessage(), e);
|
}
|
return new Date();
|
}
|
/**
|
* 比较两个日期是否一致
|
*
|
* @param dateA
|
* @param dateB
|
* @return
|
*/
|
public static boolean equals(Date dateA, Date dateB) {
|
|
if (dateA == null || dateB == null) {
|
return false;
|
}
|
String strA = dateToString(dateA, DATE_FORMAT_DD);
|
String strB = dateToString(dateB, DATE_FORMAT_DD);
|
|
if (StringUtils.equals(strA, strB)) {
|
return true;
|
}
|
|
return false;
|
}
|
|
/**
|
* 比较两个日期是否一致
|
*
|
* @param dateA
|
* @param dateB
|
* @return
|
*/
|
public static boolean notEquals(Date dateA, Date dateB) {
|
|
return !equals(dateA, dateB);
|
}
|
|
/**
|
* 判断给定的日期是一周中的第几天,注意:按照中国的习惯,周日是第七天
|
*
|
* @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) {
|
log.error(e.getLocalizedMessage(), 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) {
|
log.error(e.getLocalizedMessage(), 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) {
|
log.error(e.getLocalizedMessage(), e);
|
}
|
|
return null;
|
}
|
/**
|
*
|
* @Title: getFutureDay 获取某个时间点的未来 几天的日期
|
* @author:jyy
|
* @param date
|
* @param start
|
* @param end
|
*/
|
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(DateUtils.nextNDate(date,i));
|
}
|
return dates;
|
}
|
|
/**
|
* 指定时间的前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) {
|
log.error(e.getLocalizedMessage(), 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) {
|
log.error(e.getLocalizedMessage(), 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) {
|
log.error(e.getLocalizedMessage(), 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);
|
}
|
|
/**
|
* 判断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;
|
}
|
|
/**
|
* 判断currentDate是否在startDate和endDate之间,包括startDate和endDate
|
*
|
* @param startDate
|
* @param endDate
|
* @param currentDate
|
* @return
|
*/
|
public static boolean isBetweenDate(Date startDate, Date endDate, Date currentDate) {
|
|
if (currentDate == null) {
|
return false;
|
}
|
|
if (isAffterDate(startDate, currentDate) && isBeforeDate(endDate, currentDate)) {
|
return true;
|
}
|
// 开始接受日期判断
|
else if (startDate.equals(currentDate) ||endDate.equals(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;
|
}
|
/**
|
*
|
* @Title: getNextNMinute 获取date之后N分钟的时间
|
* @author:jyy
|
* @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));
|
}
|
/**
|
* 获取startDate到endDate之间的(中文星期)包括startDate和endDate
|
* @param startDate
|
* @param endDate
|
* @param day
|
* @return
|
*/
|
public static List<Date> findDayBetweenDate(Date startDate, Date endDate, int day) {
|
|
List<Date> listDate = new ArrayList<Date>();
|
int startDay = dateToWeek(startDate);
|
|
Date date = null;
|
if (startDay == day) {
|
date = startDate;
|
} else {
|
date = nextNDate(startDate, day - startDay);
|
}
|
while (isBetweenDate(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;
|
}
|
|
if (StringUtils.isBlank(format)) {
|
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 DateUtils.DATE_TIME_MORNING;
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtils.DATE_TIME_AFTERNOON;
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtils.DATE_TIME_NIGHT;
|
}
|
return null;
|
}
|
|
/**
|
* 获取早中晚的开始时间
|
*
|
* @param date
|
* @param time
|
* @return
|
*/
|
public static Date getMeetTimeStart(String date, int time) {
|
|
// 早上
|
if (time == 1) {
|
return DateUtils.stringToDate(date + " 06:00", DateUtils.DATE_FORMAT_MM);
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtils.stringToDate(date + " 13:00", DateUtils.DATE_FORMAT_MM);
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtils.stringToDate(date + " 19:00", DateUtils.DATE_FORMAT_MM);
|
}
|
return null;
|
}
|
|
/**
|
* 获取早中晚的结束时间
|
*
|
* @param date
|
* @param time
|
* @return
|
*/
|
|
public static Date getMeetTimeEnd(String date, int time) {
|
// 早上
|
if (time == 1) {
|
return DateUtils.stringToDate(date + " 13:00", DateUtils.DATE_FORMAT_MM);
|
}
|
// 下午
|
else if (time == 2) {
|
return DateUtils.stringToDate(date + " 19:00", DateUtils.DATE_FORMAT_MM);
|
}
|
// 晚上
|
else if (time == 3) {
|
return DateUtils.stringToDate(date + " 23:00", DateUtils.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;
|
}
|
|
/**
|
* 2016-W31 转换2016年 第31 周 周1
|
* @Title: weekStrToDate
|
* @author:jyy
|
* @return
|
* Date 返回类型
|
* @date 2016年8月31日 上午10:01:53
|
* @throws
|
*/
|
public static Date weekStrToDate(String str){
|
if(str==null){
|
return new Date();
|
}
|
Calendar c=Calendar.getInstance();
|
String[] dtime=str.split("-W");
|
if(dtime.length<2){
|
return new Date();
|
}
|
c.setWeekDate(Integer.parseInt(dtime[0]), Integer.parseInt(dtime[1]), 1);
|
return c.getTime();
|
}
|
|
/**
|
* 时间可是转 2016-W31
|
* @Title: weekStrToDate
|
* @author:jyy
|
* @return
|
* Date 返回类型
|
* @date 2016年8月31日 上午10:01:53
|
* @throws
|
*/
|
public static String dateToWorkStr(Date date){
|
Calendar c=Calendar.getInstance();
|
c.setTime(date);
|
int i = c.get(Calendar.WEEK_OF_YEAR);
|
int year=getYear(new Date());
|
return year+"-W"+i;
|
}
|
|
/**
|
* 获取时间戳
|
*
|
* @return
|
*/
|
public static String getTimeMark() {
|
return dateToString(new Date(), "yyyyMMddHHmmssSSS");
|
}
|
|
/**
|
* 获取一个编码
|
* 获取一个当前时间并且加入了四位的随机字母
|
* @return
|
*/
|
public static String getTimeCode() {
|
return dateToString(new Date(), "yyyyMMddssSSS")+ StringUtils.getRandomString(4);
|
}
|
|
/**
|
* 获取相差num个礼拜的周一
|
* @Title: getNextMonDay
|
* @author:jyy
|
* @param date
|
* @param next
|
* @return
|
* Date 返回类型
|
* @date 2016年8月29日 上午10:08:25
|
* @throws
|
*/
|
public static Date getNextMonDay(Date date,int num) {
|
Date a = org.apache.commons.lang.time.DateUtils.addDays(date, -1);
|
Calendar cal = Calendar.getInstance();
|
cal.setTime(a);
|
cal.add(Calendar.WEEK_OF_YEAR, num);
|
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
|
return cal.getTime();
|
}
|
/**
|
* 获取相差num个礼拜的周周末
|
* @Title: getNextMonDay
|
* @author:jyy
|
* @param date
|
* @param next
|
* @return
|
* Date 返回类型
|
* @date 2016年8月29日 上午10:08:25
|
* @throws
|
*/
|
public static Date getNextWeekDay(Date date,int num) {
|
Date a = org.apache.commons.lang.time.DateUtils.addDays(date, -1);
|
Calendar cal = Calendar.getInstance();
|
cal.setTime(a);
|
cal.set(Calendar.DAY_OF_WEEK, num);
|
return cal.getTime();
|
}
|
|
/**
|
*
|
* @Title: getDifTimeMonth
|
* @author:jyy
|
* @param beginTime
|
* @param endTime
|
* @return
|
* long 返回类型
|
* @date 2016年9月12日 下午5:46:27
|
* @throws
|
*/
|
public static long getDifTimeMin(Date beginTime,Date endTime){
|
return (endTime.getTime()-beginTime.getTime())/1000/ 60;
|
}
|
/**
|
* 获取多少月以后的时间
|
* @Title: nextMonth
|
* @author:jyy
|
* @param date
|
* @param num
|
* @return
|
* Date 返回类型
|
* @date 2016年10月9日 上午10:51:23
|
* @throws
|
*/
|
public static Date nextMonth(Date date, int num) {
|
|
Calendar calendar = Calendar.getInstance(); //得到日历
|
calendar.setTime(date);
|
calendar.add(calendar.MONTH,num);
|
return calendar.getTime();
|
}
|
|
/**
|
* 获取时间搓,秒级
|
* @return
|
*/
|
public static String getTimeSecent() {
|
long time=new Date().getTime();
|
System.out.println(time/1000);
|
return (time/1000)+"";
|
|
}
|
|
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[] { "摩羯座",
|
"水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座",
|
"天蝎座", "射手座", "摩羯座" };
|
|
|
/**
|
* Java通过生日计算星座
|
*
|
* @param month
|
* @param day
|
* @return
|
*/
|
public static String getConstellation(int month, int day) {
|
return day < dayArr[month - 1] ? constellationArr[month - 1]
|
: constellationArr[month];
|
}
|
|
/**
|
* 通过生日计算属相
|
*
|
* @param year
|
* @return
|
*/
|
public static String getYear(int year) {
|
if (year < 1900) {
|
return "未知";
|
}
|
int start = 1900;
|
String[] years = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊",
|
"猴", "鸡", "狗", "猪" };
|
return years[(year - start) % years.length];
|
}
|
}
|