package com.ruoyi.common.utils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.time.*; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; import org.apache.commons.lang3.time.DateFormatUtils; /** * 时间工具类 * * @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); } /** * 获取当前日期, 默认格式为yyyy * * @return String */ public static String getYear() { return dateTimeNow(YYYY); } 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))); } /** * 计算相差天数 小于就返回负数 */ public static int differentDays(Date date1, Date date2) { return (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()); } /** * 获取当前周一 * * @return */ public static String monday() { LocalDate now = LocalDate.now(); LocalDate startOfWeek = now.with(DayOfWeek.MONDAY); return String.valueOf(startOfWeek); } /** * 获取上周一 * * @return */ public static String lastMonday() { LocalDate now = LocalDate.now(); LocalDate lastMonday = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusWeeks(1); return String.valueOf(lastMonday); } /** * 获取上周日 * * @return */ public static String lastSunday() { LocalDate now = LocalDate.now(); LocalDate lastMonday = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusWeeks(1); LocalDate lastSunday = lastMonday.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); return String.valueOf(lastSunday); } /** * 获取上周一到周日的时间 * * @return */ public static List LastWeekList() { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取上周的每一天 List collect = IntStream.range(1, 8) .mapToObj(day -> String.valueOf(today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusWeeks(1).plusDays(day - 1))).collect(Collectors.toList()); return collect; } /** * 获取本周一到周日的时间 * * @return */ public static List weekList() { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取上周的每一天 List collect = IntStream.range(1, 8) .mapToObj(day -> String.valueOf(today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).plusDays(day - 1))).collect(Collectors.toList()); return collect; } /** * 增加 Date ==> LocalDate */ public static LocalDate toLocalDate(Date date) { return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } /** * 获取当月所有日期 * @return */ public static List getDay(Date date){ List dateList = new ArrayList<>(); LocalDate localDate = toLocalDate(date); LocalDate firstDayOfMoth = localDate.with(TemporalAdjusters.firstDayOfMonth()); LocalDate lastDayOfMoth = localDate.with(TemporalAdjusters.lastDayOfMonth()); for (LocalDate dateResult = firstDayOfMoth;dateResult.isBefore(lastDayOfMoth.plusDays(1));dateResult = dateResult.plusDays(1)){ dateList.add(dateResult.toString()); } return dateList; } /** * 判断当前日期是星期几 * * @param pTime 修要判断的时间 * @return dayForWeek 判断结果 * @Exception 发生异常 */ public static int dayForWeek(String pTime) throws Exception { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.setTime(format.parse(pTime)); int dayForWeek = 0; if (c.get(Calendar.DAY_OF_WEEK) == 1) { dayForWeek = 7; } else { dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1; } return dayForWeek; } /****** * 获取两个日期中间的所有日期 * @param start * @param end * @return */ public static List getDatesBetween(String start, String end) { List dates = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date startDate = sdf.parse(start); Date endDate = sdf.parse(end); Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); while (!calendar.getTime().after(endDate)) { dates.add(calendar.getTime()); calendar.add(Calendar.DAY_OF_MONTH, 1); } } catch (ParseException e) { e.printStackTrace(); } return dates; } /** * 判断两个日期相差的天数 * str2 - str1 * @return */ public static int compare(String str1,String str2) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date1 = sdf.parse(str1); Date date2 = sdf.parse(str2); return differentDays(date1, date2); } catch (ParseException e) { e.printStackTrace(); return 0; } } /** * BISO8601时间格式转yyyy-mm-dd HH:mm:ss * @param biso BISO8601时间格式 * @return */ public static String bDateToString(String biso) { // 定义ISO 8601的日期时间格式器 DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME; // 使用ISO格式器解析字符串为LocalDateTime LocalDateTime dateTime = LocalDateTime.parse(biso, isoFormatter); // 定义目标日期时间格式器(yyyy-MM-dd HH:mm:ss) DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); // 格式化日期时间为目标格式 String formattedDateTime = dateTime.format(customFormatter); return formattedDateTime; } }