分享日期处理工具类--DateUtils
package com.hl.analyze.utils; import com.google.common.collect.Lists; import com.hl.analyze.utils.enums.DateFmtEnum; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; /** * @author Starry * @date 9:46 2018/4/13 Modified By: */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils { private static final Logger log = LoggerFactory.getLogger(DateUtils.class); /** * 日期格式化 */ private static final String GS = "yyyy-MM-dd HH:mm:ss"; private static final DateTimeFormatter DF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** * 日期转换字符串 */ public static String parseDate(Date date, String gs) { SimpleDateFormat sdf = new SimpleDateFormat(gs); return sdf.format(date); } /** * 准换字符串 * * @param strDate 要转换的日期 * @param pat2 转换后的日期格式 */ public static String str2Str(String strDate, String pat2) { // 实例化模板对象 SimpleDateFormat sdf1 = new SimpleDateFormat(GS); // 实例化模板对象 SimpleDateFormat sdf2 = new SimpleDateFormat(pat2); Date d = null; try { // 将给定的字符串中的日期提取出来 d = sdf1.parse(strDate); } catch (Exception e) { log.error(e.getMessage(), e); } // 将日期变为新的格式 return (sdf2.format(d)); } public static String parseDate(Date date) { SimpleDateFormat sdf = new SimpleDateFormat(GS); return sdf.format(date); } /** * 字符串转为日期 */ public static Date stringToDate(String time, String gs) { SimpleDateFormat sDateFormat = new SimpleDateFormat(gs); Date d = null; try { d = sDateFormat.parse(time); } catch (ParseException e) { log.error(e.getMessage(), e); } return d; } public static String getSpecifiedDayBefore(String specifiedDay) { Calendar c = Calendar.getInstance(); Date date = null; try { date = new SimpleDateFormat("yyyy-MM-dd").parse(specifiedDay); } catch (ParseException e) { log.error(e.getMessage(), e); } c.setTime(date); int day = c.get(Calendar.DATE); c.set(Calendar.DATE, day - 1); String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); return dayBefore; } /** * 获取当前时间 * * @return */ public static String getDate() { Date date = new Date(); String d = parseDate(date, "yyyy-MM-dd HH:mm:ss"); return d; } /** * 获取当前时间 * * @return */ public static String getDateDay() { Date date = new Date(); String d = parseDate(date, "yyyy-MM-dd"); return d; } public static Integer getDifference(Date beginTime, Date endTime) { return (int) ((endTime.getTime() - beginTime.getTime()) / (1000 * 3600 * 24)); } /** * @Description yyyy-MM-dd HH:mm:ss */ public static Integer getDifference(String beginTime, String endTime) throws ParseException { SimpleDateFormat format = new SimpleDateFormat(GS); Date beginDate = format.parse(beginTime); Date endDate = format.parse(endTime); return (int) ((endDate.getTime() - beginDate.getTime()) / (1000 * 3600 * 24)); } /** * @Description yyyy-MM-dd HH:mm:ss */ public static List<String> getDifferenceList(String beginTime, String endTime) throws ParseException { LinkedList<String> result = Lists.newLinkedList(); LocalDateTime begin = LocalDateTime.parse(beginTime, DF); LocalDateTime end = LocalDateTime.parse(endTime, DF); int i = end.compareTo(begin); if (i == 1 && !end.toLocalDate().toString().equals(begin.toLocalDate().toString())) { result.add(begin.toLocalDate().toString()); result.add(end.toLocalDate().toString()); return result; } if (i == 1 && end.toLocalDate().toString().equals(begin.toLocalDate().toString())) { result.add(begin.toLocalDate().toString()); return result; } else if (i > 1) { for (int j = 0; j <= i; j++) { result.add(begin.toLocalDate().plusDays(j).toString()); } } return result; } /** * 获取输入时间与当前时间的差 * * @param time 比较时间 * @param level 深入层,x年x月x天x时x秒之前,level用来确定精确层数,比如level=2 则x年x月 若年为0 则x月x天 * @return x年x月x天x时x秒之前,层数受level约束 */ public static String getDateDiffForNow(LocalDateTime time, int level) { return getDateDiffStr(time, LocalDateTime.now(), level); } /** * 获取输入时间之间时间差 * * @param before 之前时间 * @param after 之后时间 * @param level 深入层,x年x月x天x时x秒之前,level用来确定精确层数,比如level=2 则x年x月 若年为0 则x月x天 * @return x年x月x天x时x秒,层数受level约束 */ public static String getDateDiffStr(LocalDateTime before, LocalDateTime after, int level) { int currLevel = 0; long lastData = 0; List<ChronoUnit> chL = Arrays.asList(ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS, ChronoUnit.HOURS, ChronoUnit.MINUTES, ChronoUnit.SECONDS); // 记录中文的时间描述 String[] desCn = {"年", "月", "天", "小时", "分", "秒"}; // 记录相邻的两个时间刻度之间的转换值,为方便计算,第一位为空缺0 int[] diff = {0, 12, 30, 24, 60, 60}; StringBuilder timeSb = new StringBuilder(); for (int i = 0; i < chL.size(); i++) { long cal = chL.get(i).between(before, after); if (cal != 0) { timeSb.append(cal - lastData * diff[i]).append(desCn[i]); currLevel++; lastData = cal; if (currLevel == level) { break; } } } return timeSb.toString(); } /** * 返回当前时间字符串,格式:yyyy-MM-dd HH:mm:ss * * @return */ public static String getNowStr() { return getNowStr(com.hl.analyze.utils.enums.DateFmtEnum.FMT_SECODE_HYPHEN); } /** * 根据格式化格式返回当前时间 * * @param fmt 格式化 * @return */ public static String getNowStr(com.hl.analyze.utils.enums.DateFmtEnum fmt) { return getNowStr(fmt.getValue()); } /** * 根据格式化格式返回当前时间 * * @param fmt 格式化 * @return */ public static String getNowStr(String fmt) { return localDateTimeFmt(LocalDateTime.now(), fmt); } /** * 将时间格式化为字符串,默认格式化为yyyy-MM-dd HH:mm:ss * * @param time 时间 * @return */ public static String localDatetimeFmt(LocalDateTime time) { return localDateTimeFmt(time, com.hl.analyze.utils.enums.DateFmtEnum.FMT_SECODE_HYPHEN); } /** * 将时间格式化为字符串 * * @param time 时间 * @param fmt 格式化 * @return */ public static String localDateTimeFmt(LocalDateTime time, DateFmtEnum fmt) { return localDateTimeFmt(time, fmt.getValue()); } /** * 将时间格式化为字符串 * * @param time 时间 * @param fmt 格式化 * @return */ public static String localDateTimeFmt(LocalDateTime time, String fmt) { return time.format(DateTimeFormatter.ofPattern(fmt)); } /** * 计算日期时间差(小时) * * @param startDate * @param endDate * @return */ public static long getDateHour(Date startDate, Date endDate) { long nd = 1000 * 60 * 60L; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - startDate.getTime(); // 计算差多少天 // long day = diff / nd /24; // 计算差多少小时 long hour = diff / nd; return hour; } /** * 计算日期时间差(分钟) * * @param startDate 开始时间 * @param endDate 结束时间 * @return */ public static long getDateMinute(Date startDate, Date endDate) { long nd = 1000 * 60L; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - startDate.getTime(); // 计算差多少分钟 long minute = diff / nd; return minute; } /** * 计算当前时间到次日0点秒数 * * @return */ public static long getTomorrowZeroSeconds() { // 当前时间毫秒数 long current = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); long tomorrowzero = calendar.getTimeInMillis(); long tomorrowzeroSeconds = (tomorrowzero - current) / 1000; return tomorrowzeroSeconds; } /** * 获取之前日期 * * @param amount 相差的天数 */ public static String getThePreviousDay(Integer amount) { Calendar calendar = new GregorianCalendar(); calendar.setTime(new Date()); calendar.add(Calendar.DATE, amount); SimpleDateFormat sdf = new SimpleDateFormat(GS); return sdf.format(calendar.getTime()); } public static List<String> getThePreviousSixDaysDate() { ArrayList<String> dateList = Lists.newArrayList(); dateList.add(DateUtils.getThePreviousDay(-1)); dateList.add(DateUtils.getThePreviousDay(-2)); dateList.add(DateUtils.getThePreviousDay(-3)); dateList.add(DateUtils.getThePreviousDay(-4)); dateList.add(DateUtils.getThePreviousDay(-5)); dateList.add(DateUtils.getThePreviousDay(-6)); return dateList; } /** * @param currentDateTime 当前时间 * @return boolean * @Description 大于当前时间为true */ public static boolean isItGreaterThanTheCurrentDate(String currentDateTime) { SimpleDateFormat sdf = new SimpleDateFormat(GS); Date today = new Date(); try { //将字符串转换为 date 类型 Debug:Sun Nov 11 00:00:00 CST 2018 Date dateD = sdf.parse(currentDateTime); return dateD.getTime() >= today.getTime(); } catch (ParseException e1) { e1.printStackTrace(); return false; } } public static List<DateSplit> splitByMinute(Date startTime, Date endTime, int intervalMinutes) { if (endTime.getTime() <= startTime.getTime()) { return null; } List<DateSplit> dateSplits = new ArrayList<>(256); DateSplit param = new DateSplit(); param.setStartDateTime(startTime); param.setEndDateTime(endTime); param.setEndDateTime(addMinute(startTime, intervalMinutes)); while (true) { param.setStartDateTime(startTime); Date tempEndTime = addMinute(startTime, intervalMinutes); if (tempEndTime.getTime() >= endTime.getTime()) { tempEndTime = endTime; } param.setEndDateTime(tempEndTime); dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime())); startTime = addMinute(startTime, intervalMinutes); if (startTime.getTime() >= endTime.getTime()) { break; } if (param.getEndDateTime().getTime() >= endTime.getTime()) { break; } } return dateSplits; } private static String formatDateTime(Date date) { if (date == null) { return ""; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return simpleDateFormat.format(date); } @Data @AllArgsConstructor @NoArgsConstructor public static class DateSplit { private Date startDateTime; private Date endDateTime; public String getStartDateTimeStr() { return formatDateTime(startDateTime); } public String getEndDateTimeStr() { return formatDateTime(endDateTime); } } private static Date addDays(Date date, int days) { return add(date, Calendar.DAY_OF_MONTH, days); } private static Date addHours(Date date, int hours) { return add(date, Calendar.HOUR_OF_DAY, hours); } private static Date addMinute(Date date, int minute) { return add(date, Calendar.MINUTE, minute); } private static Date addSeconds(Date date, int second) { return add(date, Calendar.SECOND, second); } private static Date add(final Date date, final int calendarField, final int amount) { final Calendar c = Calendar.getInstance(); c.setTime(date); c.add(calendarField, amount); return c.getTime(); } }