package com.jsh.erp.utils; 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.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; /** * 时间工具类 * * @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"; 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 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()); } /** * 增加 LocalDate ==> Date 获取最早时刻 * * @param temporalAccessor 日期 * @return 列如:2025-01-01T00:00 */ public static Date toDateMin(LocalDate temporalAccessor) { LocalDateTime localDateTime = temporalAccessor.atStartOfDay(); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } /** * 增加 LocalDate ==> Date 获取最晚时刻 * * @param temporalAccessor 日期 * @return 列如:2025-01-01T23:59:59 */ public static Date toDateMax(LocalDate temporalAccessor) { LocalDateTime localDateTime = temporalAccessor.atTime(LocalTime.MAX); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } /** * 增加 Date ==> LocalDate * * @param date 日期 * @return */ public static LocalDate toLocalDate(Date date) { if(!Optional.ofNullable(date).isPresent()){ return LocalDate.now(); } return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } /** * 增加 LocalDate ==> String * * @param date 日期 * @param format 格式 * @return */ public static String localDate2String(LocalDate date,final String format) { DateTimeFormatter fmt = DateTimeFormatter.ofPattern(format); return date.format(fmt); } /** * 当前日期前或者后多少天 * day 负数往历史日期,正数往未来 */ public static Date displacement(Integer day){ // 获取当前时间 Calendar calendar = Calendar.getInstance(); Date currentTime = new Date(); calendar.setTime(currentTime); calendar.add(Calendar.DAY_OF_MONTH, day); return calendar.getTime(); } /** * 根据当前的时间区间获取上一周期的时间区间 * @param beginTime 开始时间 * @param endTime 结束时间 * @return */ public static String[] getFrontCycleDate(String beginTime, String endTime) { //处理上一周期时间 LocalDate localDateBeginTime = LocalDate.parse(beginTime); LocalDate localDateEndTime = LocalDate.parse(endTime); //获取上一周期结束时间 LocalDate frontEndTime = localDateBeginTime.minusDays(1); LocalDate frontBeginTime; //根据筛选时间天数获取上一周期开始时间 int days = DateUtils.differentDaysByMillisecond(DateUtils.toDate(localDateBeginTime), DateUtils.toDate(localDateEndTime)); if (days == 0) { frontBeginTime = localDateBeginTime.minusDays(1); } else { frontBeginTime = localDateBeginTime.minusDays(days + 1); } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String beginTimeString = frontBeginTime.format(formatter); String endTimeString = frontEndTime.format(formatter); return new String[]{beginTimeString, endTimeString}; } /** * 获取两个日期之间的所有日期 * * @param startDateStr 开始日期字符串,格式为yyyy-MM-dd * @param endDateStr 结束日期字符串,格式为yyyy-MM-dd * @return 日期列表 */ public static List getDatesBetween(String startDateStr, String endDateStr) { // 定义日期格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 将字符串日期转换为LocalDate LocalDate startDate = LocalDate.parse(startDateStr, formatter); LocalDate endDate = LocalDate.parse(endDateStr, formatter); // 创建一个列表来存储日期 List dates = new ArrayList<>(); // 使用while循环获取两个日期之间的所有日期 LocalDate currentDate = startDate; while (!currentDate.isAfter(endDate)) { dates.add(currentDate); currentDate = currentDate.plusDays(1); // 将当前日期加一天 } return dates; } public static List getDatesBetween(LocalDate startDate, LocalDate endDate) { // 创建一个列表来存储日期 List dates = new ArrayList<>(); // 使用while循环获取两个日期之间的所有日期 LocalDate currentDate = startDate; while (!currentDate.isAfter(endDate)) { dates.add(currentDate); currentDate = currentDate.plusDays(1); // 将当前日期加一天 } return dates; } /** * 校验字符日期格式是否正确 */ public static boolean isDateValid(String inputDate, String format) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); LocalDate.parse(inputDate, formatter); } catch (DateTimeParseException e) { return false; } return true; } }