package com.ycl.utils; import org.apache.commons.lang3.time.DateFormatUtils; import org.glassfish.jaxb.core.v2.TODO; import javax.annotation.Nullable; import java.lang.management.ManagementFactory; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.util.Calendar; import java.util.Date; import java.util.Objects; /** * 时间工具类 * * @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))); } /** * 计算相差小时 */ public static int differentHoursByMillisecond(Date date1, Date date2) { return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600))); } /** * 计算时间差 * * @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()); } /** * 获取某天的开始时间 * * @param date * @return 2023-01-01 00:00:00 */ public static Date getDayStart(@Nullable Date date) { if (Objects.isNull(date)) { date = new Date(); } LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.of("GMT+8")); LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 0, 0, 0); return Timestamp.valueOf(of); } /** * 获取某天的结束时间 * * @param date * @return 2023-01-01 23:59:59 */ public static Date getDayEnd(@Nullable Date date) { if (Objects.isNull(date)) { date = new Date(); } LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59); return Timestamp.valueOf(of); } /** * 获取某月开始日期 */ public static String getMouthStart(@Nullable Date date) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); if (date != null) { c.setTime(date); // 如果date不为null,则设置Calendar的日期为date } c.set(Calendar.DAY_OF_MONTH,1); return df.format(c.getTime()); } /** * 获取某月结束日期 */ public static String getMouthEnd(@Nullable Date date) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); if (date != null) { c.setTime(date); // 如果date不为null,则设置Calendar的日期为date } c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); return df.format(c.getTime()); } /** * 获取指定Calendar的季度开始日期 * @param calendar 日历 * @return 季度第一天 */ public static Calendar getQuarterStart(Calendar calendar) { Calendar quarterStart = (Calendar) calendar.clone(); // 设置为当前季度的第一个月的第一天 quarterStart.set(Calendar.DAY_OF_MONTH, 1); int month = quarterStart.get(Calendar.MONTH); quarterStart.set(Calendar.MONTH, (month / 3) * 3); return quarterStart; } /** * 获取指定Calendar的季度结束日期 * @param calendar 日历 * @return 季度最后一天 */ public static Calendar getQuarterEnd(Calendar calendar) { Calendar quarterEnd = getQuarterStart(calendar); // 将月份设置为下一个季度的第一个月 quarterEnd.add(Calendar.MONTH, 3); // 设置为那个月的最后一天 quarterEnd.add(Calendar.DAY_OF_MONTH, -1); return quarterEnd; } public static Date getDay(int year,int month,int day) { // 获取Calendar实例,默认使用当前时区和语言环境 Calendar calendar = Calendar.getInstance(); // 清除Calendar中的所有字段值,以避免它们对当前日期时间有影响 calendar.clear(); // 设置年份、月份(注意:月份是从0开始的,所以8月是7)、日期 calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, day); // Calendar.getTime()方法返回一个表示此Calendar时间值的Date对象 Date date = calendar.getTime(); return date; } public static Integer getDayOfMonth(Date date) { // 创建一个Calendar对象并设置为当前日期和时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(date); // 获取当前日期是当月中的第几天 return calendar.get(Calendar.DAY_OF_MONTH); } }