<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">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;

/**
 * &lt;b&gt; 鏃ユ湡閫氱敤澶勭悊宸ュ叿绫� &lt;/b&gt;
 * @author ZXF
 * @create 2021/03/22 0022 10:31
 * @version
 * @娉ㄦ剰浜嬮」 &lt;/b&gt;
 */
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&gt;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());
	}

	/**
	 * 寰楀埌褰撳墠鏃ユ湡瀛楃涓� 鏍煎紡锛坹yyy-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);
	}

	/**
	 * 灏嗙壒瀹氭牸寮忕殑鏃ユ湡杞崲涓篋ate瀵硅薄
	 * @param dateString 鐗瑰畾鏍煎紡鐨勬棩鏈�
	 * @param format 鏍煎紡锛屼緥濡倅yyy-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();
	}

	/**
	 * 
	 * 鍒ゆ柇涓や釜鏃ユ湡鐩稿樊鐨勬椂闀�&lt;br/&gt;(鍒楋細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 &lt;= HOUR_MS)
			return diff / MINUTE_MS + "鍒嗛挓鍓�";
		else if(diff &lt;= DAY_MS)
			return diff / HOUR_MS + "灏忔椂" + (diff % HOUR_MS / MINUTE_MS) + "鍒嗛挓鍓�";
		else if(diff &lt;= DAY_MS * 2)
			return "鏄ㄥぉ" + calendar.get(Calendar.HOUR_OF_DAY) + "鐐�"+ calendar.get(Calendar.MINUTE) + "鍒�";
		else if(diff &lt;= DAY_MS * 3)
			return "鍓嶅ぉ" + calendar.get(Calendar.HOUR_OF_DAY) + "鐐�"+ calendar.get(Calendar.MINUTE) + "鍒�";
		else if(diff &lt;= MONTH_MS)
			return diff / DAY_MS + "澶╁墠" + calendar.get(Calendar.HOUR_OF_DAY) + "鐐�"+ calendar.get(Calendar.MINUTE) + "鍒�";
		else if(diff &lt;= 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 &lt;= HOUR_MS)
			return "鍙墿涓�" + remain / MINUTE_MS + "鍒嗛挓";
		else if (remain &lt;= 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);
	}
	
	/**鑾峰彇鏃堕棿鎴虫牸寮�,杩斿洖鏍煎紡涓篩YYY-MM-DD HH:MM:SS:SSS*/
	public static Timestamp getTimestamp() {
		Date date = new Date();
		Timestamp nousedate = new Timestamp(date.getTime());
		return nousedate;
	}

	/**
	 * &lt;b&gt; 鑾峰彇绮剧‘鍒扮鐨勬椂闂存埑 &lt;/b&gt;
	 * @author ZXF
	 * @create 2021/11/22 0022 17:28
	 * @version
	 * @娉ㄦ剰浜嬮」 &lt;/b&gt;
	 */
	public static int getSecondTimestamp(Date date){
		if (null == date) {
			return 0;
		}
		String timestamp = String.valueOf(date.getTime()/1000);
		return Integer.valueOf(timestamp);
	}

	/**String杞珼ate*/
	public static Date convertString2Date(String time) {
		Date date = new Date();
		// 娉ㄦ剰format鐨勬牸寮忚涓庢棩鏈烻tring鐨勬牸寮忕浉鍖归厤
		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;
	}
}
</pre></body></html>