package com.panzhihua.common.utlis; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import lombok.extern.slf4j.Slf4j; @Slf4j public class DateUtils { public static DateTimeFormatter format_ymdhms = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static DateTimeFormatter format_ymd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static DateTimeFormatter format_ymdhms_string = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); public static DateTimeFormatter format_ymdhms_yyyyMMddmmHHssSSS = DateTimeFormatter.ofPattern("yyyyMMddmmHHssSSS"); public static DateTimeFormatter format_ymdhms_no_signal = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); public static SimpleDateFormat yyyyMMdd_format = new SimpleDateFormat("yyyy-MM-dd"); public static SimpleDateFormat yyyy_MM_dd_format = new SimpleDateFormat("yyyy/MM/ddHH:mm:ss"); public static SimpleDateFormat ymdhms_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static SimpleDateFormat ymdhm_format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); public static DateTimeFormatter format_ymd_String = DateTimeFormatter.ofPattern("yyMMdd"); public static SimpleDateFormat yyyyMM_format = new SimpleDateFormat("yyyy-MM"); public static SimpleDateFormat format_yyymmdd = new SimpleDateFormat("yyyyMMdd"); public static SimpleDateFormat format_yyyy = new SimpleDateFormat("yyyy"); public static SimpleDateFormat format_yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss"); private static DateTimeFormatter format_ymdhmssss = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); private static DateTimeFormatter format_ymds = DateTimeFormatter.ofPattern("yyyyMMdd"); private static DateTimeFormatter format_yms = DateTimeFormatter.ofPattern("yyyyMM"); private static DateTimeFormatter format_y = DateTimeFormatter.ofPattern("yyyy"); /** * 将日期对象格式化成指定的字符串格式 * * @param date * 日期对象 * @param formatString * 格式化字符串 * @return String */ public static String getDateFormatString(Date date, String formatString) { String dateString = ""; SimpleDateFormat format = new SimpleDateFormat(formatString); if (date != null) { dateString = format.format(date); } return dateString; } /** * 字符串转date * * @param date * 时间戳 * @param format * format * @return 时间 */ public static Date stringToDate(String date, SimpleDateFormat format) { try { if (StringUtils.isBlank(date)) { return null; } return format.parse(date); } catch (ParseException e) { log.error(e.getMessage(), e); } return null; } /** * 字符串转date * * @param date * 时间戳 * @return 时间 */ public static Date stringToDateStandard(String date) { SimpleDateFormat format = ymdhms_format; if (StringUtils.isNotBlank(date)) { if (date.split("-").length == 3) { if (date.split(":").length != 3) { format = yyyyMMdd_format; } } else if (date.split("-").length == 2) { format = new SimpleDateFormat("yyyy-MM"); } try { return format.parse(date); } catch (ParseException e) { log.error(e.getMessage(), e); } } return null; } /** * 字符串转date * * @param date * 时间戳 * @return 时间 */ public static Date stringToDateStandardByYYYY_MM_dd(String date) { SimpleDateFormat format = yyyy_MM_dd_format; if (StringUtils.isNotBlank(date)) { try { return format.parse(date); } catch (ParseException e) { log.error(e.getMessage(), e); } } return null; } /** * 获取当前时间 * * @return * @throws Exception */ public static LocalDateTime getCurrentDate() { LocalDateTime now = LocalDateTime.now(); return now; } /** * 返回当前事件的时间戳 * * @return */ public static Long getCurrentDateTimeStamp() { return LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); } /** * 获取当前时间字符串,格式为yyyy-MM-dd HH:mm:ss * * @return */ public static String getCurrentDateStr() { String nowtime = getCurrentDate().format(format_ymdhms); return nowtime; } public static String getCurrentDateymd() { String nowtime = getCurrentDate().format(format_ymdhms_string); return nowtime; } public static String getCurrentDateyymd() { String nowtime = getCurrentDate().format(format_ymd_String); return nowtime; } /** * 获取当前时间字符串,格式为yyyyMMdd * * @return */ public static String getCurrentDateString() { String nowtime = getCurrentDate().format(format_ymds); return nowtime; } /** * 获取当前时间字符串,格式为yyyy-MM-dd * * @return */ public static String getCurrentDateStrymd() { String nowtime = getCurrentDate().format(format_ymd); return nowtime; } public static String getCurrentDateStr_MS() { String nowtime = getCurrentDate().format(format_ymdhmssss); return nowtime; } /** * 获取当前时间long值 * * @return */ public static long getCurrentDataLong() { return new Date().getTime(); } /** * 获取当前时间 * * @param format * @return * @throws Exception */ public static Date getCurrentDate(SimpleDateFormat format) { String tempDate = format.format(new Date()); try { return format.parse(tempDate); } catch (ParseException e) { log.error(e.getMessage(), e); } return null; } /** * @param date * @param newFormat * @return * @throws Exception */ public static Date getDate(Date date, SimpleDateFormat newFormat) { String tempDate = newFormat.format(date); try { return newFormat.parse(tempDate); } catch (ParseException e) { log.error(e.getMessage(), e); } return null; } public static String format(Date date, SimpleDateFormat format) { if (null == date) { return ""; } return format.format(date); } /** * 将给定的时间秒转换为中文格式的时分秒 * * @param second * @return */ public static String formatSecond_ZH_HMS(Integer second) { String result = "0秒"; if (null != second) { int hours = second / (60 * 60); int minutes = second / 60 - hours * 60; int seconds = second - minutes * 60 - hours * 60 * 60; String format; Object[] array; if (hours > 0) { format = "%1$,d时%2$,d分%3$,d秒"; array = new Object[] {hours, minutes, seconds}; } else if (minutes > 0) { format = "%1$,d分%2$,d秒"; array = new Object[] {minutes, seconds}; } else { format = "%1$,d秒"; array = new Object[] {seconds}; } result = String.format(format, array); } return result; } /** * 对日期进行加法操作 * * @param date * @param days * @return */ public static Date addDay(Date date, Integer days) { if (null != date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DATE, days); return cal.getTime(); } return null; } /** * 对日期进行加法操作 * * @param date * @param month * @return */ public static Date addMonth(Date date, Integer month) { if (null != date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH, month); return cal.getTime(); } return null; } /** * 对日期进行加法操作 * * @param date * @param hours * @return */ public static Date addHours(Date date, Integer hours) { if (null != date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.HOUR_OF_DAY, hours); return cal.getTime(); } return null; } /** * 对日期的分钟进行加法操作 * * @param date * @param minutes * @return */ public static Date addMinutes(Date date, Integer minutes) { if (null != date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MINUTE, minutes); return cal.getTime(); } return null; } /** * 比较两个日期的大小 * * @param date1 * @param date2 * @return 日期相等,返回0;前者大,返回1;后者大,返回-1; */ public static int dateCompare(Date date1, Date date2) { Calendar c1 = Calendar.getInstance(); c1.setTime(date1); Calendar c2 = Calendar.getInstance(); c2.setTime(date2); return c1.compareTo(c2); } /** * 判断当前日期是否在指定日期区域内(包含起止日期) [startDate,endDate] *
* [null,null] --> return 1; * * @param now * @param startDate * @param endDate * @return -1:超出并小于startDate;0:在范围内;1:超出并大于endDate; */ public static int validateDate(Date now, Date startDate, Date endDate) { if (null == startDate && null == endDate) { return 0; } if (null == startDate) { // 当前时间大于endDate if (dateCompare(now, endDate) == 1) { return 1; } else { return 0; } } else { if (null == endDate) { // 当前时间小于startDate if (dateCompare(startDate, now) == 1) { return -1; } else { return 0; } } else { if (dateCompare(startDate, now) == 1) { return -1; } else if (dateCompare(now, endDate) == 1) { return 1; } else { return 0; } } } } /** * 计算两个日期先差多少秒 * * @param pre * 前一个日期 * @param after * 后一个日期 * @return */ public static long calTimeDifference(Date pre, Date after) { return (after.getTime() - pre.getTime()) / 1000; } /** * 计算两个时间相差的天数 * * @param stardate * @param enddate * @return */ public static int getHour(Date stardate, Date enddate) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; long diff = enddate.getTime() - stardate.getTime(); long day = diff / nd; long hour = diff / nh; long min = diff / nm; return (int)hour; } /** * 结束时间与当前时间计算相差的月数 * * @param enddate * @return */ public static int getMonthSpace(String enddate, DateTimeFormatter format) { LocalDate formatted = LocalDate.parse(enddate, format); LocalDate today = LocalDate.now(); Period per = Period.between(today, formatted); if (per.getYears() == 0) { return per.getMonths(); } else if (per.getYears() > 0) { return (per.getYears() * 12) + per.getMonths(); } return (per.getYears() * 12) + per.getMonths(); } /** * 获取某个时间段之前的时间点 * * @return */ public static String getSomeTimeStapStr(String sign) { LocalDateTime beginDateTime = null; if (sign.equals("day")) {// 一天前时间 beginDateTime = LocalDateTime.now().minusDays(1L); } else if (sign.equals("week")) { beginDateTime = LocalDateTime.now().minusWeeks(1L); } else if (sign.equals("month")) { beginDateTime = LocalDateTime.now().minusMonths(1L); } else if (sign.equals("year")) { beginDateTime = LocalDateTime.now().minusYears(1L); } String beginTime = beginDateTime.format(format_ymdhms); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { long timestap = sdf.parse(beginTime).getTime(); beginTime = timestap + ""; } catch (ParseException e) { e.printStackTrace(); } return beginTime; } public static String getSomeTimeDateStr(String sign) { String beginTime = ""; LocalDateTime beginDateTime = null; if (sign.equals("day")) {// 一天前时间 beginDateTime = LocalDateTime.now().minusDays(1L); } else if (sign.equals("week")) { beginDateTime = LocalDateTime.now().minusWeeks(1L); } else if (sign.equals("month")) { beginDateTime = LocalDateTime.now().minusMonths(1L); } else if (sign.equals("year")) { beginDateTime = LocalDateTime.now().minusYears(1L); } if (beginDateTime != null) { beginTime = beginDateTime.format(format_ymdhms); } return beginTime; } /** * 获取失效时间点(在什么时间失效) * * @param minutes * 有效分钟数 * @return */ public static LocalDateTime getInvalidLocalDateTime(Long minutes) { return LocalDateTime.now().minusMinutes(minutes); } /** * 获取当前年份 * * @return */ public static String getCurrentYear() { Calendar instance = Calendar.getInstance(); return instance.get(Calendar.YEAR) + ""; } /** * 获取当前月份 * * @return */ public static String getCurrentMonth() { Calendar instance = Calendar.getInstance(); int month = instance.get(Calendar.MONTH); String result; if (month < 10) { result = "0" + month; } else { result = month + ""; } return result; } /** * 获取无符号的当前时间 * * @return */ public static String getCurrentDateStrNoSignal() { return getCurrentDate().format(format_ymdhms_no_signal); } /** * 获取前几个小时的时间 * * @param hours * @return */ public static String getNextHourDateStrNoSignal(long hours) { return LocalDateTime.now().plusHours(hours).format(format_ymdhms_no_signal); } public static Date localDateTimeToDate(LocalDateTime localDateTime) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); return Date.from(instant); } /** * 小时取整 * * @param date * @param hour * @return */ public static Date integralHour(Date date, Integer hour) { if (date == null || hour == null) { return null; } long l = date.getTime() - 1; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); try { Date parse = sdf.parse(sdf.format(new Date(l))); return addHours(parse, hour); } catch (ParseException e) { return null; } } /** * 分钟取整 以十分钟为单位 ,去除尾端,加上 参数 46->40+minutes*10 * * @param date * @param minutes * @return */ public static Date integral10Min(Date date, Integer minutes) { if (date == null || minutes == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(date); int i = cal.get(Calendar.MINUTE);// 获取分钟 if (i % 10 == 0) { minutes--; } minutes = minutes * 10 - i % 10; long l = date.getTime() - 1; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); try { Date parse = sdf.parse(sdf.format(new Date(l))); return addMinutes(parse, minutes); } catch (ParseException e) { return null; } } /** * 天数取整 * * @param date * @param day * @return */ public static Date integralDay(Date date, Integer day) { if (date == null || day == null) { return null; } long l = date.getTime() - 1; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00"); try { Date parse = sdf.parse(sdf.format(new Date(l))); return addDay(parse, day); } catch (ParseException e) { return null; } } /** * 日期相加减 * * @param time * 时间字符串 yyyy-MM-dd HH:mm:ss * @param num * 加的数,-num就是减去 * @return 减去相应的数量的年的日期 * @throws ParseException */ public static Date yearAddNum(Date time, Integer num) { // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // Date date = format.parse(time); Calendar calendar = Calendar.getInstance(); calendar.setTime(time); calendar.add(Calendar.YEAR, num); Date newTime = calendar.getTime(); return newTime; } public static boolean isValidDate(String str) { boolean convertSuccess = true; SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); try { format.setLenient(false); format.parse(str); } catch (ParseException e) { convertSuccess = false; } return convertSuccess; } public static Date toValidDate(String str) { Date date = null; SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); try { format.setLenient(false); date = format.parse(str); } catch (ParseException e) { log.error("党员导入日期格式错误"); date = new Date(); } return date; } /** * 将日期对象格式化成yyyy-MM-dd格式的字符串 * * @param date * 日期对象 * @return String */ public static String getDateStringYMD(Date date) { String dateString = ""; if (date != null) { dateString = yyyyMMdd_format.format(date); } return dateString; } /** * 获取当前月第一天 * * @return */ public static Date getFirstDayOfMonth() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 0); int actualMinimum = cal.getActualMinimum(Calendar.DAY_OF_MONTH); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), actualMinimum, 00, 00, 00); return cal.getTime(); } /** * 获取当前年月的第一天时间 * * @param year * 年份 * @param month * 月份 * @return 时间 */ public static Date getYearMonthStart(Integer year, Integer month) { Calendar cal = Calendar.getInstance(); // 设置年份 cal.set(Calendar.YEAR, year); // 设置月份 cal.set(Calendar.MONTH, month - 1); // 获取某月最小天数 int firstDay = cal.getMinimum(Calendar.DATE); // 设置日历中月份的最小天数 cal.set(Calendar.DAY_OF_MONTH, firstDay); int actualMinimum = cal.getActualMinimum(Calendar.DAY_OF_MONTH); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), actualMinimum, 00, 00, 00); return cal.getTime(); } /** * 获取当前年月的最后一天时间 * * @param year * 年份 * @param month * 月份 * @return 时间 */ public static Date getYearMonthEnd(Integer year, Integer month) { Calendar cal = Calendar.getInstance(); // 设置年份 cal.set(Calendar.YEAR, year); // 设置月份 cal.set(Calendar.MONTH, month - 1); // 获取某月最大天数 int lastDay = cal.getMaximum(Calendar.DATE); // 设置日历中月份的最大天数 cal.set(Calendar.DAY_OF_MONTH, lastDay); int actualMinimum = cal.getActualMinimum(Calendar.DAY_OF_MONTH); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), actualMinimum, 00, 00, 00); return cal.getTime(); } public static Date getDateM(Date start, int min) { Calendar date1 = Calendar.getInstance(); date1.setTime(start); date1.add(Calendar.MONTH, min); return date1.getTime(); } public static Date parseDateYM(String str) { try { return yyyyMM_format.parse(str); } catch (ParseException e) { e.printStackTrace(); } return null; } public static int getMonth(Date date) { Calendar instance = Calendar.getInstance(); instance.setTime(date); return instance.get(Calendar.MONTH); } public static int getYear(Date date) { Calendar instance = Calendar.getInstance(); instance.setTime(date); return instance.get(Calendar.YEAR); } public static boolean before(Date start, Date end) { Calendar date1 = Calendar.getInstance(); date1.setTime(start); Calendar date2 = Calendar.getInstance(); date2.setTime(end); return date1.before(date2); } /** * date2比date1多的天数 * * @param date1 * @param date2 * @return */ public static int differentDays(Date date1, Date date2) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); int day1 = cal1.get(Calendar.DAY_OF_YEAR); int day2 = cal2.get(Calendar.DAY_OF_YEAR); int year1 = cal1.get(Calendar.YEAR); int year2 = cal2.get(Calendar.YEAR); if (year1 != year2) // 同一年 { int timeDistance = 0; for (int i = year1; i < year2; i++) { if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) // 闰年 { timeDistance += 366; } else // 不是闰年 { timeDistance += 365; } } return timeDistance + (day2 - day1); } else // 不同年 { // System.out.println("判断day2 - day1 : " + (day2-day1)); return day2 - day1; } } /** * 计算剩余天数,不足一天按一天算 * @param expireDate * @return */ public static int retrieveRemainingDays(Date expireDate) { Date nowDate = new Date(); Calendar startDate = Calendar.getInstance(); startDate.setTime(nowDate); Calendar endDate = Calendar.getInstance(); endDate.setTime(expireDate); Calendar date = (Calendar) startDate.clone(); int daysBetween = 0; while (date.before(endDate)) { date.add(Calendar.DAY_OF_MONTH, 1); daysBetween++; } return daysBetween; } /** * 获取当前月第一天 * * @return */ public static String getFirstDayOfMonthString() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 0); calendar.set(Calendar.DAY_OF_MONTH, 1); // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(calendar.getTime()) + " 00:00:00"; } /** * 获取当前月最后一天 * * @return */ public static String getLastDayOfMonthString() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 0); // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(calendar.getTime()) + " 23:59:59"; } /** * 获取当前月最后一天 * * @return */ public static Date getLastDayOfMonth() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 0); // 格式化日期 return calendar.getTime(); } /** * 获取当前时间(年月日) * * @return */ public static String getDayOfMonthString() { Calendar today = Calendar.getInstance(); today.set(Calendar.HOUR, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.SECOND, 0); today.set(Calendar.MILLISECOND, 0); // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(today.getTime()); } /** * 日期转周 * * @param datetime * @return */ public static String dateToWeek(String datetime) { SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"}; Calendar cal = Calendar.getInstance(); // 获得一个日历 Date datet = null; try { if (StringUtils.isNotEmpty(datetime)) { datet = f.parse(datetime); cal.setTime(datet); } } catch (ParseException e) { e.printStackTrace(); } int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个周中的某天。 if (w < 0) w = 0; return weekDays[w]; } public static void main(String[] args) throws Exception { // List