package net.lab1024.smartadmin.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; /** * 线程安全的date工具类 * * @author jiaozi */ public class SmartDateUtil extends DateUtils { private static final ThreadLocal dateFormats = new ThreadLocal() { @Override protected DateFormats initialValue() { return new DateFormats(); } }; public static final int HOUR_MIN = 60; public static final int DAY_MI_SECOND = 24 * 60 * 60 * 1000; public static final int DAY_MINUTE_SECOND = 60 * 1000; public static final int DAY_MIAO_SECOND = 60 * 1000 * 60; public static Date getDate() { LocalDateTime localDateTimeNow = LocalDateTime.now(); Date from = Date.from(localDateTimeNow.atZone(ZoneId.systemDefault()).toInstant()); return from; } public static String formatYMD(Date date) { return dateFormats.get().ymd.format(date); } public static String formatYMDDigital(Date date) { return dateFormats.get().ymdDigital.format(date); } public static String formatYMDHMSDigital(Date date) { return dateFormats.get().ymdhmsDigital.format(date); } public static String formatYM(Date date) { return dateFormats.get().ym.format(date); } public static String formatHMS(Date date) { return dateFormats.get().hms.format(date); } public static String formatHM(Date date) { return dateFormats.get().hm.format(date); } public static String formatYMDHM(Date date) { return dateFormats.get().ymdhm.format(date); } public static String formatYMDHMS(Date date) { return dateFormats.get().ymdhms.format(date); } public static String formatYMDChinese(Date date) { return dateFormats.get().ymdChinese.format(date); } public static String formatYMDSlash(Date date) { return dateFormats.get().ymdSlash.format(date); } public static Date parseYMD(String dateStr) { return parse(dateFormats.get().ymd, dateStr); } public static Date parseYMDDigital(String dateStr) { return parse(dateFormats.get().ymdDigital, dateStr); } public static Date parseYMDHMSDigital(String dateStr) { return parse(dateFormats.get().ymdhmsDigital, dateStr); } public static Date parseformatYMDChinese(String dateStr) { return parse(dateFormats.get().ymdChinese, dateStr); } public static Date parseYM(String dateStr) { return parse(dateFormats.get().ym, dateStr); } public static Date parseYMDHMS(String dateStr) { return parse(dateFormats.get().ymdhms, dateStr); } public static Date parseYMDHM(String dateStr) { return parse(dateFormats.get().ymdhm, dateStr); } public static Date parseTodayHMS(String dateStr) { String today = formatYMD(new Date()); String todayDateStr = String.format("%s %s", today, dateStr); return parse(dateFormats.get().ymdhms, todayDateStr); } /** * 判断当前时间是否在某段时间内 参数不区分先后顺序 */ public static boolean isDuringTwoDate(Date date, Date another) { long dateTime = date.getTime(); long anotherTime = another.getTime(); long currentTime = System.currentTimeMillis(); if (currentTime > dateTime && currentTime < anotherTime) { return true; } else if (currentTime > anotherTime && currentTime < dateTime) { return true; } else { return false; } } public static Date parse(SimpleDateFormat format, String dateStr) { try { Date d = format.parse(dateStr); Calendar c = Calendar.getInstance(); c.setTime(d); int year = c.get(Calendar.YEAR); if (year >= 1000 && year <= 9999) { return d; } else { return null; } } catch (Exception ex) { return null; } } public static long daysOffset(Date date1, Date date2) { date1 = parseYMD(formatYMD(date1)); date2 = parseYMD(formatYMD(date2)); return (date1.getTime() - date2.getTime()) / DAY_MI_SECOND; } public static long minutesOffset(Date date1, Date date2) { date1 = parseYMDHMS(formatYMDHMS(date1)); date2 = parseYMDHMS(formatYMDHMS(date2)); return (date1.getTime() - date2.getTime()) / DAY_MINUTE_SECOND; } public static long miaoOffset(Date date1, Date date2) { date1 = parseYMDHMS(formatYMDHMS(date1)); date2 = parseYMDHMS(formatYMDHMS(date2)); return (date1.getTime() - date2.getTime()) / DAY_MINUTE_SECOND; } /** * 今天是星期几 , 7表示星期日 * * @return */ public static int getTodayDayOfWeek() { Calendar now = Calendar.getInstance(); int dayOfweek = now.get(Calendar.DAY_OF_WEEK); dayOfweek--; if (dayOfweek == 0) { dayOfweek = 7; } return dayOfweek; } public static boolean isTodaytDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar todayCalendar = Calendar.getInstance(); if (calendar.get(Calendar.YEAR) != todayCalendar.get(Calendar.YEAR)) { return false; } else if (calendar.get(Calendar.MONTH) != todayCalendar.get(Calendar.MONTH)) { return false; } else if (calendar.get(Calendar.DAY_OF_MONTH) != todayCalendar.get(Calendar.DAY_OF_MONTH)) { return false; } return true; } /** * 设置Calendar的小时、分钟、秒、毫秒 * * @param calendar 日历 * @param hour 小时 * @param minute 分钟 * @param second 秒 * @param milliSecond 毫秒 */ public static void setCalender(Calendar calendar, int hour, int minute, int second, int milliSecond) { calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, second); calendar.set(Calendar.MILLISECOND, milliSecond); } /** * 获取指定天开始时间 * * @param date 日期 * @return 获得该日期的开始 */ public static Date getDayBegin(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); setCalender(calendar, 0, 0, 0, 0); return calendar.getTime(); } /** * 获取指定天结束时间 * * @param date 日期 * @return 获得该日期的结束 */ public static Date getDayEnd(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); setCalender(calendar, 23, 59, 59, 999); return calendar.getTime(); } /** * 获取该日期当月第一天 * * @param date * @return */ public static Date getMonthBegin(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(getDayBegin(date)); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTime(); } /** * 获取该日期当月最后一天getAgeByBirthday * * @param date * @return */ public static Date getMonthEnd(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(getDayEnd(date)); calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.DAY_OF_MONTH, - 1); return calendar.getTime(); } public static String timeDifference(Date endDate) { Date nowDate = new Date(); long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // 获得两个时间的毫秒时间差异 long diff = nowDate.getTime() - endDate.getTime(); // 计算差多少天 long day = diff / nd; if (day > 0) { return day + "天前"; } // 计算差多少小时 long hour = diff % nd / nh; if (hour > 0) { return hour + "小时前"; } // 计算差多少分钟 long min = diff % nd % nh / nm; if (min > 0) { return "1小时内"; } return "1小时内"; } /** * 计算所用时长 * * @param startDate * @param endDate * @return */ public static BigDecimal timeDifferenceMin(Date startDate, Date endDate) { long nm = 1000 * 60; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - startDate.getTime(); BigDecimal min = BigDecimal.valueOf(diff).divide(BigDecimal.valueOf(nm), RoundingMode.HALF_UP); return min; } /** * 功能描述: 是否为当天 * * @param dateStr yyyy-mm-dd * @return * @auther yandanyang * @date 2018/10/16 0016 下午 17:43 */ public static boolean isCurrentDayYMD(String dateStr) { if (StringUtils.isEmpty(dateStr)) { return true; } String current = SmartDateUtil.formatYMD(new Date()); if (current.equals(dateStr)) { return true; } return false; } /** * 功能描述: 是否为当月 * * @param dateStr yyyy-mm-dd * @return * @auther yandanyang * @date 2018/10/16 0016 下午 17:43 */ public static boolean isCurrentMonthYMD(String dateStr) { if (StringUtils.isEmpty(dateStr)) { return true; } String queryDate = SmartDateUtil.formatYM(SmartDateUtil.parseYMD(dateStr)); String current = SmartDateUtil.formatYM(new Date()); if (current.equals(queryDate)) { return true; } return false; } public static boolean isCurrentMonthYM(String dateStr) { if (StringUtils.isEmpty(dateStr)) { return true; } String current = SmartDateUtil.formatYM(new Date()); if (current.equals(dateStr)) { return true; } return false; } /** * 获取本周的开始时间 * * @return */ public static Date getBeginDayOfWeek() { Date date = new Date(); if (date == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(date); int dayofweek = cal.get(Calendar.DAY_OF_WEEK); if (dayofweek == 1) { dayofweek += 7; } cal.add(Calendar.DATE, 2 - dayofweek); return getDayBegin(cal.getTime()); } /** * 获取本周的结束时间 * * @return */ public static Date getEndDayOfWeek() { Calendar cal = Calendar.getInstance(); cal.setTime(getBeginDayOfWeek()); cal.add(Calendar.DAY_OF_WEEK, 6); Date weekEndSta = cal.getTime(); return getDayEnd(weekEndSta); } /** * 获取两个日期区间的日期(包括这两个日期) */ public static List getiIntervalDate(String dateBegin, String dateEnd) { List dateList = new ArrayList<>(); Date startDate = SmartDateUtil.parseYMDHMS(dateBegin); Date endDate = SmartDateUtil.parseYMDHMS(dateEnd); Calendar cal = Calendar.getInstance(); cal.setTime(startDate); dateList.add(dateBegin); while (cal.getTime().compareTo(endDate) < 0) { cal.add(Calendar.DAY_OF_MONTH, 1); if(cal.getTime().compareTo(endDate) > 0){ cal.setTime(endDate); } dateList.add(SmartDateUtil.formatYMDHMS(cal.getTime())); } return dateList; } /** * 获取两个日期区间的日期(包括这两个日期) */ public static List getiIntervalHour(String dateBegin, String dateEnd) { List dateList = new ArrayList<>(); Date startDate = SmartDateUtil.parseYMDHMS(dateBegin); Date endDate = SmartDateUtil.parseYMDHMS(dateEnd); Calendar cal = Calendar.getInstance(); cal.setTime(startDate); dateList.add(dateBegin); while (cal.getTime().compareTo(endDate) < 0) { cal.add(Calendar.MINUTE, 10); if(cal.getTime().compareTo(endDate) > 0){ cal.setTime(endDate); } dateList.add(SmartDateUtil.formatYMDHMS(cal.getTime())); } return dateList; } /** * 返回某个日期后几天的日期 * * @param date * @param i * @return */ public static Date getNextDay(Date date, int i) { Calendar cal = new GregorianCalendar(); cal.setTime(date); cal.set(Calendar.DATE, cal.get(Calendar.DATE) + i); return cal.getTime(); } /** * 返回某个日期前几天的日期 * * @param date * @param i * @return */ public static Date getFrontDay(Date date, int i) { Calendar cal = new GregorianCalendar(); cal.setTime(date); cal.set(Calendar.DATE, cal.get(Calendar.DATE) - i); return cal.getTime(); } /** * 获取昨天的开始时间 * * @return */ public static Date getBeginDayOfYesterday() { Calendar cal = new GregorianCalendar(); cal.setTime(getDayBegin(new Date())); cal.add(Calendar.DAY_OF_MONTH, - 1); return cal.getTime(); } /** * 获取昨天的结束时间 * * @return */ public static Date getEndDayOfYesterDay() { Calendar cal = new GregorianCalendar(); cal.setTime(getDayEnd(new Date())); cal.add(Calendar.DAY_OF_MONTH, - 1); return cal.getTime(); } public static Integer getDayNumOfMonth(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); Integer num = c.getActualMaximum(Calendar.DAY_OF_MONTH); return num; } /** * 转换日期(格式:年-月-日 时:分--分自定义) */ public static String formatYMDH(Date date, String minute) { String ymdhm = dateFormats.get().ymdh + ":" + minute; SimpleDateFormat format = new SimpleDateFormat(ymdhm); return format.format(date); } /** * 获取几个月后的日期 */ public static Date getAfterMonth(Date inputDate, int number) { Calendar c = Calendar.getInstance();//获得一个日历的实例 c.setTime(inputDate);//设置日历时间 c.add(Calendar.MONTH, number);//在日历的月份上增加月 return c.getTime(); } /** * 计算当前月有多少天 */ public static int getDays(int year, int month) { int days = 0; if (month != 2) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; } } else { // 闰年 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { days = 29; } else { days = 28; } } System.out.println("当月有" + days + "天!"); return days; } public static Date getCurrYearFirst(){ Calendar currCal=Calendar.getInstance(); int currentYear = currCal.get(Calendar.YEAR); return getYearFirst(currentYear); } /** * 获取当年的最后一天 * @param year * @return */ public static Date getCurrYearLast(){ Calendar currCal=Calendar.getInstance(); int currentYear = currCal.get(Calendar.YEAR); return getYearLast(currentYear); } /** * 获取某年第一天日期 * @param year 年份 * @return Date */ public static Date getYearFirst(int year){ Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, year); Date currYearFirst = calendar.getTime(); return currYearFirst; } /** * 获取某年最后一天日期 * @param year 年份 * @return Date */ public static Date getYearLast(int year){ Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.roll(Calendar.DAY_OF_YEAR, -1); Date currYearLast = calendar.getTime(); return currYearLast; } /** * 返回一年所有月份 * @return */ public static List getMonth(){ List monthList = new ArrayList<>(); Calendar date = Calendar.getInstance(); String year = String.valueOf(date.get(Calendar.YEAR)); for(int i=1;i<13;i++){ if(i<10){ monthList.add(year+"-0"+i+""); }else{ monthList.add(year+"-"+i+""); } } return monthList; } public static String UTCtoCST(long sec){ long utc = sec*1000L; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式按需自定义 format.setTimeZone(TimeZone.getTimeZone("GMT+08")); //北京时区GMT+8 return format.format(new Date(utc)); } public static void main(String[] args) { System.out.println(UTCtoCST(1622510202)); } } class DateFormats { public final SimpleDateFormat hms = new SimpleDateFormat("HH:mm:ss"); public final SimpleDateFormat hm = new SimpleDateFormat("HH:mm"); public final SimpleDateFormat ymdhm = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); public final SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd"); public final SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM"); public final SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public final SimpleDateFormat ymdChinese = new SimpleDateFormat("yyyy年MM月dd日"); public final SimpleDateFormat ymdSlash = new SimpleDateFormat("yyyy/MM/dd"); public final SimpleDateFormat ymdDigital = new SimpleDateFormat("yyyyMMdd"); public final SimpleDateFormat ymdhmsDigital = new SimpleDateFormat("yyyyMMddHHmmss"); public static final String ymdh = "yyyy-MM-dd HH"; }