package com.os.common.utils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import org.apache.commons.lang3.time.DateFormatUtils; import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; /** * 时间工具类 * * @author ruoyi */ 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 YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public 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 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 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 int differentDaysByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } /** * 计算时间差 * * @param endDate 最后时间 * @param startTime 开始时间 * @return 时间差(天/小时/分钟) */ public static String timeDistance(Date endDate, Date startTime) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // long ns = 1000; // 获得两个时间的毫秒时间差异 long diff = endDate.getTime() - startTime.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 + "分钟"; } /** * 增加 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()); } /** * 生成两个日期之间的每个时间点(支持小时、日、月、年) * 假设:输入格式与粒度匹配: * HOURS -> yyyy-MM-dd HH:mm:ss * DAYS -> yyyy-MM-dd * MONTHS -> yyyy-MM * YEARS -> yyyy * * @param startDateStr 开始时间字符串 * @param endDateStr 结束时间字符串 * @param unit 时间粒度(支持 HOURS, DAYS, MONTHS, YEARS) */ public static List getTimeIntervals(String startDateStr, String endDateStr, String unit) { String pattern; int calendarField; switch (unit) { case "19": pattern = "yyyy-MM-dd HH:mm:ss"; calendarField = Calendar.HOUR_OF_DAY; break; case "10": pattern = "yyyy-MM-dd"; calendarField = Calendar.DAY_OF_MONTH; break; case "7": pattern = "yyyy-MM"; calendarField = Calendar.MONTH; break; case "4": pattern = "yyyy"; calendarField = Calendar.YEAR; break; default: throw new IllegalArgumentException("Unsupported unit: " + unit); } SimpleDateFormat sdf = new SimpleDateFormat(pattern); List intervals = new ArrayList<>(); try { Calendar start = Calendar.getInstance(); start.setTime(sdf.parse(startDateStr)); Calendar end = Calendar.getInstance(); end.setTime(sdf.parse(endDateStr)); while (!start.after(end)) { intervals.add(sdf.format(start.getTime())); start.add(calendarField, 1); } } catch (ParseException e) { throw new RuntimeException("日期解析失败: " + e.getMessage(), e); } return intervals; } /** * 获取时间范围信息 * @return 包含各种时间范围的Map */ public static Map getDateTimeRanges() { Map timeMap = new HashMap<>(); String nowDateTime = LocalDateTime.now() .withMinute(0) .withSecond(0) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00")); //当前时间 timeMap.put("currentTime", nowDateTime); String lastYearDateTime = LocalDateTime.now() .minusYears(1) // 关键修改:减去1年 .withMinute(0) .withSecond(0) .withNano(0) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00")); timeMap.put("lastYearCurrentTime", lastYearDateTime); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); // 当天开始时间 (00:00:00) LocalDateTime todayStart = now.toLocalDate().atStartOfDay(); timeMap.put("todayStart", todayStart.format(formatter)); // 当月开始时间 (当月1日 00:00:00) LocalDateTime monthStart = now.withDayOfMonth(1).toLocalDate().atStartOfDay(); timeMap.put("monthStart", monthStart.format(formatter)); // 当年开始时间 (当年1月1日 00:00:00) LocalDateTime yearStart = now.withDayOfYear(1).toLocalDate().atStartOfDay(); timeMap.put("yearStart", yearStart.format(formatter)); // 去年当天开始时间 LocalDateTime lastYearTodayStart = todayStart.minusYears(1); timeMap.put("lastYearTodayStart", lastYearTodayStart.format(formatter)); // 去年当月开始时间 LocalDateTime lastYearMonthStart = monthStart.minusYears(1); timeMap.put("lastYearMonthStart", lastYearMonthStart.format(formatter)); // 去年当年开始时间 LocalDateTime lastYearYearStart = yearStart.minusYears(1); timeMap.put("lastYearYearStart", lastYearYearStart.format(formatter)); return timeMap; } /** * 获取去年同时间的日期字符串 * @param dateTimeStr 格式必须为 "yyyy-MM-dd HH:mm:ss" * @return 去年同时间的字符串,格式相同 */ public static String getLastYearDateTime(String dateTimeStr) { // 定义日期时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析字符串为 LocalDateTime LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter); // 减去一年 LocalDateTime lastYearDateTime = dateTime.minusYears(1); // 格式化为字符串返回 return lastYearDateTime.format(formatter); } }