package com.bcxin.signature.util;
import com.bcxin.signature.util.common.StringUtil;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* 日期通用处理工具类
* @author ZXF
* @create 2021/03/22 0022 10:31
* @version
* @注意事项
*/
public class DateUtil extends DateUtils {
private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
/** 毫秒 */
public final static long MS = 1;
/** 每秒钟的毫秒数 */
public final static long SECOND_MS = MS * 1000;
/** 每分钟的毫秒数 */
public final static long MINUTE_MS = SECOND_MS * 60;
/** 每小时的毫秒数 */
public final static long HOUR_MS = MINUTE_MS * 60;
/** 每天的毫秒数 */
public final static long DAY_MS = HOUR_MS * 24;
/** 每月的毫秒数 */
public final static long MONTH_MS = DAY_MS * 30;
/** 每年的毫秒数 */
public final static long YEAR_MS = MONTH_MS * 12;
public static final String FORMAT1 = "yyyy-MM-dd HH:mm:ss";
public static final String FORMAT2 = "yyyy-MM-dd";
/**
* 当前时间,格式 yyyy-MM-dd HH:mm:ss
* @return 当前时间的标准形式字符串
*/
public static String now() {
return formatDateTime(new Date());
}
/**
* 格式 yyyy-MM-dd HH:mm:ss
* @param date 被格式化的日期
* @return 格式化后的日期
*/
public static String formatDateTime(Date date) {
SimpleDateFormat NORM_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return NORM_DATETIME_FORMAT.format(date);
}
/**
* 转换为时间(天,时:分:秒.毫秒)
* @param timeMillis
* @return
*/
public static String formatDateTime(long timeMillis){
long day = timeMillis/(24*60*60*1000);
long hour = (timeMillis/(60*60*1000)-day*24);
long min = ((timeMillis/(60*1000))-day*24*60-hour*60);
long s = (timeMillis/1000-day*24*60*60-hour*60*60-min*60);
long sss = (timeMillis-day*24*60*60*1000-hour*60*60*1000-min*60*1000-s*1000);
return (day>0?day+",":"")+hour+":"+min+":"+s+"."+sss;
}
/**
* 获取当前日期时间
* @return
*/
public static String getCurrentDateTime() {
return getCurrentDateTime(FORMAT1);
}
/**
* 获取当前日期
* @return
*/
public static String getCurrentDate() {
return getCurrentDateTime(FORMAT2);
}
/**
* 当前日期,格式 yyyy-MM-dd
* @return 当前日期的标准形式字符串
*/
/**
* 根据特定格式获取当前时间
* @param format
* @return
*/
public static String getCurrentDateTime(String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
return df.format(new Date());
}
public static String today() {
return formatDate(new Date());
}
/**
* 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*/
public static String getDate(String pattern) {
return DateFormatUtils.format(new Date(), pattern);
}
/**
* 获取过去的天数
* @param date
* @return
*/
public static long pastDays(Date date) {
long t = System.currentTimeMillis()-date.getTime();
return t/(24*60*60*1000);
}
/**
* 根据特定格式格式化日期
* @param date 被格式化的日期
* @param format 格式
* @return 格式化后的字符串
*/
public static String format(Date date, String format) {
return new SimpleDateFormat(format).format(date);
}
/**
* 格式化为Http的标准日期格式
* @param date 被格式化的日期
* @return HTTP标准形式日期字符串
*/
public static String formatHttpDate(Date date) {
SimpleDateFormat HTTP_DATETIME_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
return HTTP_DATETIME_FORMAT.format(date);
}
/**
* 格式 yyyy-MM-dd
* @param date 被格式化的日期
* @return 格式化后的字符串
*/
public static String formatDate(Date date) {
SimpleDateFormat NORM_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
return NORM_DATE_FORMAT.format(date);
}
/**
* 将特定格式的日期转换为Date对象
* @param dateString 特定格式的日期
* @param format 格式,例如yyyy-MM-dd
* @return 日期对象
*/
public static Date parse(String dateString, String format) {
if(StringUtil.isBlank(dateString)){
SimpleDateFormat NORM_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateString = NORM_DATETIME_FORMAT.format(new Date());
}
try {
return (new SimpleDateFormat(format)).parse(dateString);
} catch (ParseException e) {
logger.error("Parse " + dateString + " with format " + format + " error!", e);
}
return null;
}
/**
* 格式yyyy-MM-dd HH:mm:ss
* @param dateString 标准形式的时间字符串
* @return 日期对象
*/
public static Date parseDateTime(String dateString) {
SimpleDateFormat NORM_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return NORM_DATETIME_FORMAT.parse(dateString);
} catch (ParseException e) {
logger.error("Parse " + dateString + " with format " + NORM_DATETIME_FORMAT.toPattern() + " error!", e);
}
return null;
}
public static Date matchFormatByLength(String dateString) {
SimpleDateFormat NORM_DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
int num = dateString.length();
if(num == 16){
SimpleDateFormat NORM_DATETIME_FORMAT1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return NORM_DATETIME_FORMAT1.parse(dateString);
}else if(num == 19){
return NORM_DATETIME_FORMAT.parse(dateString);
}else {
SimpleDateFormat NORM_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
return NORM_DATE_FORMAT.parse(dateString);
}
} catch (ParseException e) {
logger.error("Parse " + dateString + " with format " + NORM_DATETIME_FORMAT.toPattern() + " error!", e);
}
return null;
}
/**
* 格式yyyy-MM-dd
* @param dateString 标准形式的日期字符串
* @return 标准形式的日期字符串
*/
public static Date parseDate(String dateString) {
SimpleDateFormat NORM_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
try {
return NORM_DATE_FORMAT.parse(dateString);
} catch (ParseException e) {
logger.error("Parse " + dateString + " with format " + NORM_DATE_FORMAT.toPattern() + " error!", e);
}
return null;
}
/**
*
* 获取指定日期偏移指定时间后的时间
*
* @param date
* 基准日期
*
* @param calendarField
* 偏移的粒度大小(小时、天、月等)使用Calendar中的常数
*
* @param offsite
* 偏移量,正数为向后偏移,负数为向前偏移
*
* @return 偏移后的日期
*
*/
public static Date getOffsiteDate(Date date, int calendarField, int offsite) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(calendarField, offsite);
return cal.getTime();
}
/**
*
* 判断两个日期相差的时长
(列:1年前7月25日)
*
* 返回 minuend - subtrahend 的差
*
* @param subtrahend
* 减数日期
*
* @param minuend
* 被减数日期
*
* @return 日期差
*
*/
public static String dateDiff(Date subtrahend, Date minuend) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(subtrahend);
long diff = minuend.getTime() - subtrahend.getTime();
if(diff <= HOUR_MS)
return diff / MINUTE_MS + "分钟前";
else if(diff <= DAY_MS)
return diff / HOUR_MS + "小时" + (diff % HOUR_MS / MINUTE_MS) + "分钟前";
else if(diff <= DAY_MS * 2)
return "昨天" + calendar.get(Calendar.HOUR_OF_DAY) + "点"+ calendar.get(Calendar.MINUTE) + "分";
else if(diff <= DAY_MS * 3)
return "前天" + calendar.get(Calendar.HOUR_OF_DAY) + "点"+ calendar.get(Calendar.MINUTE) + "分";
else if(diff <= MONTH_MS)
return diff / DAY_MS + "天前" + calendar.get(Calendar.HOUR_OF_DAY) + "点"+ calendar.get(Calendar.MINUTE) + "分";
else if(diff <= YEAR_MS)
return diff / MONTH_MS + "个月" + (diff % MONTH_MS) / DAY_MS + "天前" + calendar.get(Calendar.HOUR_OF_DAY) + "点"+ calendar.get(Calendar.MINUTE) + "分";
else
return diff / YEAR_MS + "年前" + (calendar.get(Calendar.MONTH) + 1) + "月"+ calendar.get(Calendar.DATE) + "日";
}
/**
* 距离截止日期还有多长时间
*
* @param date
* @return
*/
public static String fromDeadline(Date date) {
long deadline = date.getTime();
long now = System.currentTimeMillis();
long remain = deadline - now;
if (remain <= HOUR_MS)
return "只剩下" + remain / MINUTE_MS + "分钟";
else if (remain <= DAY_MS)
return "只剩下" + remain / HOUR_MS + "小时"
+ (remain % HOUR_MS / MINUTE_MS) + "分钟";
else {
long day = remain / DAY_MS;
long hour = remain % DAY_MS / HOUR_MS;
long minute = remain % DAY_MS % HOUR_MS / MINUTE_MS;
return "只剩下" + day + "天" + hour + "小时" + minute + "分钟";
}
}
/**
* 获取过去的分钟
* @param date
* @return
*/
public static long pastMinutes(Date date) {
long t = System.currentTimeMillis()-date.getTime();
return t/(60*1000);
}
/**获取时间戳格式,返回格式为YYYY-MM-DD HH:MM:SS:SSS*/
public static Timestamp getTimestamp() {
Date date = new Date();
Timestamp nousedate = new Timestamp(date.getTime());
return nousedate;
}
/**
* 获取精确到秒的时间戳
* @author ZXF
* @create 2021/11/22 0022 17:28
* @version
* @注意事项
*/
public static int getSecondTimestamp(Date date){
if (null == date) {
return 0;
}
String timestamp = String.valueOf(date.getTime()/1000);
return Integer.valueOf(timestamp);
}
/**String转Date*/
public static Date convertString2Date(String time) {
Date date = new Date();
// 注意format的格式要与日期String的格式相匹配
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = sdf.parse(time);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**计算两个Date数据的大小*/
public static long calculateTwoDateDvalue(Date date1, Date date2) {
Calendar cal = Calendar.getInstance();// 定义日历类型的变量
// 将日期型的日期设置成日历型日期
cal.setTime(date1);// 应归还日期
long date1value = cal.getTimeInMillis();// 定义日历类型的变量
cal.setTime(date2);// 应归还日期
long date2value = cal.getTimeInMillis();// 定义日历类型的变量
return date1value - date2value;
}
public static Date getDayStart(Date currentDate) {
Date result = null;
Calendar current = Calendar.getInstance();
current.setTime(currentDate);
current.set(Calendar.HOUR_OF_DAY, 0);
current.clear(Calendar.MILLISECOND);
current.clear(Calendar.MINUTE);
current.clear(Calendar.SECOND);
result = current.getTime();
return result;
}
}