package com.hq.schoolcj.util;import java.text.ParseException;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.ZoneId;import java.util.Calendar;import java.util.Date;import java.util.Locale;public class DateUtils { /** * 时间格式(yyyy-MM-dd) */ public final static String DATE_PATTERN = "yyyy-MM-dd"; public final static String DATE_PATTERN_FOR_SECOND = "yyyy-MM-dd HH:mm:ss"; public final static String MM_DD_HH_MM = "MM月dd日 HH:mm"; public final static String MM_DD = "MM-dd"; public final static String HH_MM = "HH:mm"; public static final String DEFUALT_LONG_TIME_FORMAT = "yyyyMMddHHmmss"; public static String format(Date date) { return format(date, DATE_PATTERN); } /** * 计算两个日期的相差月份 * @param startDate 开始时间 * @param endDate 结束时间 * @return */ public static Integer getDifMonth(Date startDate, Date endDate){ if (startDate == null || endDate == null) { return 0; } Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); start.setTime(startDate); end.setTime(endDate); int result = end.get(Calendar.MONTH) - start.get(Calendar.MONTH); int month = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12; return Math.abs(month + result); } /** * 日期转字符串 * * @param date * @param pattern * @return */ public static String format(Date date, String pattern) { if (date != null) { SimpleDateFormat df = new SimpleDateFormat(pattern); return df.format(date); } return null; } /** * 日期字符串转时间戳 * * @param dateStr * @return */ public static Integer transForMilliSecond(String dateStr) { Date date = DateUtils.formatDate(dateStr); return date == null ? null : DateUtils.transForMilliSecond(date); } /** * 日期字符串转日期 * * @param string * @param pattern * @return */ public static Date formatDate(String string, String pattern) { if (StringUtils.isNotBlank(string)) { try { return new SimpleDateFormat(pattern).parse(string); } catch (ParseException e) { e.printStackTrace(); } } return null; } /** * 字符串转日期 * * @param string * @return */ public static Date formatDate(String string) { return formatDate(string, DATE_PATTERN); } /** * 日期转时间戳 (秒) * * @param date * @return */ public static Integer transForMilliSecond(Date date) { if (date == null) { return null; } return (int) (date.getTime() / 1000); } /** * 时间戳转日期字符串"yyyy-MM-dd" * * @param ms * @return */ public static String transForDate(Integer ms) { String str = ""; if (ms != null) { long msl = (long) ms * 1000; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if (ms != null) { try { str = sdf.format(msl); } catch (Exception e) { e.printStackTrace(); } } } return str; } /** * 时间戳转日期字符串"yyyy-MM-dd"或"yyyy-MM-dd HH:mm:ss" *精确到毫秒的字符串 * @param seconds * @return */ public static String transForDate(String seconds, String pattern) { if(seconds == null || seconds.isEmpty() || seconds.equals("null")){ return ""; } if(pattern == null || pattern.isEmpty()){ pattern = "yyyy-MM-dd HH:mm:ss"; } SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(new Date(Long.valueOf(seconds))); } /** * 订单有效期,获取当前时间完后day天后的时间 * * @param day 推移时间 * @return 推移后的时间 */ public static Date orderDateValidity(Long day) { return getDateAfter(new Date(), day.intValue()); } /*** * * @param d * :Base Date * @param day * :Delayed days * @return */ public static java.util.Date getDateAfter(Date d, int day) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.DATE, now.get(Calendar.DATE) + day); return now.getTime(); } /** * 给时间加上几个小时 * * @param date 当前时间 格式:yyyy-MM-dd HH:mm:ss * @param hour 需要加的时间 * @return */ public static String addDateHour(Date date, int hour) { if (date == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.HOUR_OF_DAY, hour); date = cal.getTime(); return format(date, DEFUALT_LONG_TIME_FORMAT); } /** * 获取现在时间 * * @return 返回时间类型 yyyy-MM-dd HH:mm:ss */ public static Date getNowDate() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); ParsePosition pos = new ParsePosition(8); Date currentTime_2 = formatter.parse(dateString, pos); return currentTime_2; } /** * 得到现在时间 * * @return */ public static Date getNow() { Date currentTime = new Date(); return currentTime; } /* * 把时间戳装换为时间字符串 * * */ public static String getDateString4LongTime(Long timeStamp) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); return formatter.format(new Date(timeStamp)); } public static String dateToString(Date date) { SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN_FOR_SECOND); return sdf.format(date); } public static Date stringToDate(String date, String pattern) { SimpleDateFormat sdf = new SimpleDateFormat(pattern); try { return sdf.parse(date); } catch (ParseException e) { e.printStackTrace(); } return new Date(); } /*** * * @param d : 基准时间 * @param day : 几天前 * @return */ public static Date getDateBefore(Date d, int day) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.DATE, now.get(Calendar.DATE) - day); return now.getTime(); } public static Date parse(String string, String pattern) { if (StringUtils.isNotBlank(string)) { try { return new SimpleDateFormat(pattern).parse(string); } catch (ParseException e) { e.printStackTrace(); } } return null; } public static Date parse(String string) { return parse(string, DATE_PATTERN); } /** * 毫秒转化为xx小时xx分钟 * * @param longTime * @return */ public static String longTimeToString(Long longTime) { if (longTime == null || longTime == 0L) { return ""; } int hour = (int) (longTime / (1000 * 60 * 60)); int min = (int) ((longTime % (1000 * 60 * 60)) / (1000 * 60)); if (hour < 1) { return min + "分钟"; } else if (hour >= 1 && min == 0) { return hour + "小时"; } else if (hour >= 1 && min > 0) { return hour + "小时" + min + "分钟"; } return ""; } /** * 日期转化为String * * @param date * @return date string * @author xuyidong */ public static String toString(Date date) { if (null == date) { return null; } try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); return sdf.format(date); } catch (Exception e) { return null; } } /** * 指定日期加指定天数 * * @param date * @param dayNum * @return */ public static String convertDate(Date date, int dayNum) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DATE, dayNum); Date date2 = calendar.getTime(); String dateFormat = sdf.format(date2); return dateFormat; } /** * 当前时间添加时间 * @param type 1代表 日 2代表 月 3代表 年 * @param num 数量 * @return */ public static Date convertDate(int type,Integer num){ if(num==null){ num=0; } SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN_FOR_SECOND); Date nowDate = new Date(); try{ nowDate=sdf.parse(sdf.format(nowDate)); }catch (Exception e){ } Calendar calendar = Calendar.getInstance(); calendar.setTime(nowDate); if(type==1){ calendar.add(Calendar.DATE, num); }else if(type==2){ calendar.add(Calendar.MONTH, num); }else if(type==3){ calendar.add(Calendar.YEAR, num); } Date date2 = calendar.getTime(); return date2; } public static void main(String[] args) {// Date a = formatDate("2019-12-27", "yyyy-MM-dd");// Date b = formatDate("2020-01-11", "yyyy-MM-dd");// Integer difMonth = getDifMonth(a, b);// System.out.println(difMonth);// int i = new Date() - formatDate("2019-12-07 17:30:); } /** * Date 转化为jdk8 LocalDate * * @param date * @return LocalDate * @author chen xin yu * @date 2019-09-02 20:05 */ public static LocalDate dateToLocalDate(Date date) { Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); return localDateTime.toLocalDate(); } /** * jdk8 LocalDate 转化为 Date * * @param localDate * @return Date * @author chen xin yu * @date 2019-09-02 20:06 */ public static Date LocalDateToDate(LocalDate localDate) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDate.atStartOfDay().atZone(zone).toInstant(); return Date.from(instant); } /** * jdk8 LocalDateTime 转化为 Date * * @param localDateTime * @return Date * @author chen xin yu * @date 2019-09-02 20:06 */ public static Date LocalDateTimeToDate(LocalDateTime localDateTime) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); return Date.from(instant); } /** * Date 转化为jdk8 LocalDateTime * * @param date * @return LocalDate * @author chen xin yu * @date 2019-09-02 20:05 */ public static LocalDateTime dateToLocalDateTime(Date date) { Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); return localDateTime; } /** * 时间加上指定天数后的日期 * * @param date 时间 * @param day 增加的天数 * @return date 返回最终时间零点的毫秒值 */ public static Date datePlusDays(Date date, long day) { //支付时间 LocalDateTime localDateTime = DateUtils.dateToLocalDateTime(date); //订单有效期截止时间 LocalDate localDate = localDateTime.plusDays(day).toLocalDate(); return DateUtils.LocalDateToDate(localDate); } /** * 天数转化为xx年xx月 * * @param day 天数 * @return */ public static String dayToYearMonth(Long day) { if (day == null || day == 0L) { return ""; } int year = (int) (day / 365); int month = (int) ((day % 365)/30); if (year < 1) { return month + "个月"; } else if (year >= 1 && month == 0) { return year + "年"; } else if (year >= 1 && month > 0) { return year + "年" + month + "个月"; } return ""; } /** * 按照指定格式返回当前时间,如果格式为空,则默认为yyyy-MM-dd * * @param dateFormat * @return */ public static Date strToDate(String date, String dateFormat) { if (date == null) { return null; } if (org.apache.commons.lang.StringUtils.isBlank(dateFormat)) { if (date.length() > 10) { dateFormat = DEFUALT_LONG_TIME_FORMAT; } else { dateFormat = DATE_PATTERN; } } try { SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); return sdf.parse(date); } catch (Exception e) { return null; } }}