package com.project.common.utils; import com.project.common.core.domain.model.DateRange; import org.apache.commons.lang3.time.DateFormatUtils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.util.Calendar; import java.util.Date; /** * 时间工具类 * * @author jinhui */ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; public static String YYYY_MM = "yyyy-MM"; public static String YYYY_MM_DD = "yyyy-MM-dd"; public static String YYYYMMDD = "yyyyMMdd"; public static String YYMMDD = "yyMMdd"; public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** * 获取当前Date型日期 * * @return Date() 当前日期 */ public static Date getNowDate() { return new Date(); } /** * 获取当前日期, 默认格式为yyyy-MM-dd * * @return String */ public static String getDate() { return dateTimeNow(YYYY_MM_DD); } public static final String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); } public static final String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); } public static final String dateNow() { return dateTimeNow(YYYYMMDD); } public static final String yearNow() { return dateTimeNow(YYMMDD); } public static final String dateTimeNow(final String format) { return parseDateToStr(format, new Date()); } public static final String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); } public static final String dateTimeHh(final Date date) { return parseDateToStr(YYYY_MM_DD_HH_MM_SS, date); } public static final String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); } public static final Date dateTime(final String format, final String ts) { try { return new SimpleDateFormat(format).parse(ts); } catch (ParseException e) { throw new RuntimeException(e); } } /** * 日期路径 即年/月/日 如2018/08/08 */ public static final String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } /** * 日期路径 即年/月/日 如20180808 */ public static final String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } /** * 日期型字符串转化为日期 格式 */ public static Date parseDate(Object str) { if (str == null) { return null; } try { return parseDate(str.toString(), parsePatterns); } catch (ParseException e) { return null; } } /** * 获取服务器启动时间 */ public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); return new Date(time); } /** * 计算两个时间差 */ public static String getDatePoor(Date endDate, Date nowDate) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // long ns = 1000; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - nowDate.getTime(); // 计算差多少天 long day = diff / nd; // 计算差多少小时 long hour = diff % nd / nh; // 计算差多少分钟 long min = diff % nd % nh / nm; // 计算差多少秒//输出结果 // long sec = diff % nd % nh % nm / ns; return day + "天" + hour + "小时" + min + "分钟"; } /** * 计算两个时间差天数 */ public static long getDays(Date endDate, Date stratDate) { long nd = 1000 * 24 * 60 * 60; // long ns = 1000; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - stratDate.getTime(); // 计算差多少天 return diff / nd; } //时间类型日期转换格式 public static Date getDateFormatyyyyMMdd(String string) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = dateFormat.parse(string); return date; } catch (ParseException e) { e.printStackTrace(); } return null; } public static Date getDateFormatyyyyMMdd01(String string) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); try { Date date = dateFormat.parse(string); return date; } catch (ParseException e) { e.printStackTrace(); } return null; } public static String getFormatDatedd(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); try { String limitdate = dateFormat.format(date); return limitdate; } catch (Exception e) { e.printStackTrace(); } return ""; } public static String getFormatMonth(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMM"); try { String limitdate = dateFormat.format(date); return limitdate; } catch (Exception e) { e.printStackTrace(); } return ""; } public static String getDateStr(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); try { String limitdate = dateFormat.format(date); return limitdate; } catch (Exception e) { e.printStackTrace(); } return ""; } //获取前几天 或 后几天 时间 public static Date getBeforeOrAfterDate(Date date ,int num) { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DAY_OF_MONTH, num); return c.getTime(); } //获取前几月 或 后几月 时间 public static Date getBeforeOrAfterDateByMonth (Date date ,int num) { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH, num); return c.getTime(); } /** * 获取月份 * @param date * @return */ public static Integer getMonth(Date date){ if(date == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.get(Calendar.MONTH)+1; } // 根据指定日期获取上一周日期 public static DateRange lastWeek(Date date) { Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); calendar1.setTime(date); calendar2.setTime(date); int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1; if(dayOfWeek <= 0){ dayOfWeek = 7; } int offset1 = 1 - dayOfWeek; int offset2 = 7 - dayOfWeek; calendar1.add(Calendar.DATE, offset1 - 7); calendar2.add(Calendar.DATE, offset2 - 7); // last Monday String lastBeginDate = getFormatDatedd(calendar1.getTime()); System.out.println(calendar1.getTime()); // last Sunday String lastEndDate = getFormatDatedd(calendar2.getTime()); // return lastBeginDate + "," + lastEndDate; System.out.println(lastBeginDate+lastEndDate); return new DateRange(lastBeginDate,lastEndDate); } // 根据指定日期获取当前周日期 public static DateRange nowWeek(Date date){ Calendar cal = Calendar.getInstance(); cal.setTime(date); int dayWeek = cal.get(Calendar.DAY_OF_WEEK); if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } cal.setFirstDayOfWeek(Calendar.MONDAY); int day = cal.get(Calendar.DAY_OF_WEEK); cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); String imptimeBegin = dateTime(cal.getTime()); cal.add(Calendar.DATE, 6); String imptimeEnd = dateTime(cal.getTime()); return new DateRange(imptimeBegin,imptimeEnd); } /** * 获取date的月份的时间范围 * @param date * @return */ public static DateRange getMonthRange(Date date) { Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(date); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(date); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取当前季度的时间范围 * @return current quarter */ public static DateRange getThisQuarter() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3) * 3); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3) * 3 + 2); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取昨天的时间范围 * @return */ public static DateRange getYesterdayRange() { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.DAY_OF_MONTH, -1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.DAY_OF_MONTH, -1); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取今天的时间范围 * @return */ public static DateRange getTodayRange() { Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.DAY_OF_MONTH, 0); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.DAY_OF_MONTH, 0); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取当前月份的时间范围 * @return */ public static DateRange getThisMonth() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取当前年的时间范围 * @return */ public static DateRange getThisYear() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(startCalendar.get(Calendar.YEAR), 0, startCalendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0); startCalendar.set(Calendar.DAY_OF_MONTH, startCalendar.getActualMinimum(Calendar.DAY_OF_MONTH)); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(endCalendar.get(Calendar.YEAR), 11, 31, 0, 0, 0); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取上个月的时间范围 */ public static DateRange getLastMonth(){ Calendar startCalendar = Calendar.getInstance(); startCalendar.add(Calendar.MONTH, -1); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.add(Calendar.MONTH, -1); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } /** * 获取上个季度的时间范围 */ public static DateRange getLastQuarter() { Calendar startCalendar = Calendar.getInstance(); startCalendar.set(Calendar.MONTH, ((int) startCalendar.get(Calendar.MONTH) / 3 - 1) * 3); startCalendar.set(Calendar.DAY_OF_MONTH, 1); setMinTime(startCalendar); Calendar endCalendar = Calendar.getInstance(); endCalendar.set(Calendar.MONTH, ((int) endCalendar.get(Calendar.MONTH) / 3 - 1) * 3 + 2); endCalendar.set(Calendar.DAY_OF_MONTH, endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)); setMaxTime(endCalendar); return new DateRange(startCalendar.getTime(), endCalendar.getTime()); } private static void setMinTime(Calendar calendar){ calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); } private static void setMaxTime(Calendar calendar){ calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY)); calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE)); calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND)); calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND)); } /** * 通过时间秒毫秒数判断两个时间的间隔 * @param date1 * @param date2 * @return */ public static int differentDaysByMillisecond(Date date1, Date date2) { int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)); return days; } /** * 增加 LocalDateTime ==> Date */ public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } /** * 增加 LocalDate ==> Date */ public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } public static boolean dateCompare(Date beginDate, Date endDate) { if(null == beginDate || null == endDate) return false; // endDate > beginDate if (endDate.getTime() > beginDate.getTime()) { return true; } return false; } //获取第二天返钱时间 public static Date getNextMoneyDate() { Date date = dateTime(DateUtils.YYYY_MM_DD, getDate()); return DateUtils.getBeforeOrAfterDate(date, 1); } }