package com.cdzy.user.utils; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; /** * 时间工具类 * * @author yanglei * @since 2026-01-16 14:29 */ public class DateUtils { private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** * 获取今天的开始时间(00:00:00) */ public static LocalDateTime getTodayStart() { return LocalDateTime.of(LocalDate.now(), LocalTime.MIN); } /** * 获取今天的结束时间(23:59:59) */ public static LocalDateTime getTodayEnd() { return LocalDateTime.of(LocalDate.now(), LocalTime.MAX); } /** * 获取今天的时间范围 * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getTodayRange() { return new LocalDateTime[]{getTodayStart(), getTodayEnd()}; } /** * 获取近7天的时间范围(包括今天) * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getLast7DaysRange() { LocalDateTime end = getTodayEnd(); LocalDateTime start = getTodayStart().minusDays(6); return new LocalDateTime[]{start, end}; } /** * 获取近30天的时间范围(包括今天) * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getLast30DaysRange() { LocalDateTime end = getTodayEnd(); LocalDateTime start = getTodayStart().minusDays(29); return new LocalDateTime[]{start, end}; } /** * 获取指定天数前的时间范围 * @param days 天数 * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getLastDaysRange(int days) { LocalDateTime end = getTodayEnd(); LocalDateTime start = getTodayStart().minusDays(days - 1); return new LocalDateTime[]{start, end}; } /** * 获取本周的时间范围 * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getThisWeekRange() { LocalDate today = LocalDate.now(); LocalDate startOfWeek = today.with(java.time.DayOfWeek.MONDAY); LocalDate endOfWeek = today.with(java.time.DayOfWeek.SUNDAY); LocalDateTime start = LocalDateTime.of(startOfWeek, LocalTime.MIN); LocalDateTime end = LocalDateTime.of(endOfWeek, LocalTime.MAX); return new LocalDateTime[]{start, end}; } /** * 获取本月的时间范围 * @return 包含开始时间和结束时间的数组 [startTime, endTime] */ public static LocalDateTime[] getThisMonthRange() { LocalDate today = LocalDate.now(); LocalDate startOfMonth = today.withDayOfMonth(1); LocalDate endOfMonth = today.withDayOfMonth(today.lengthOfMonth()); LocalDateTime start = LocalDateTime.of(startOfMonth, LocalTime.MIN); LocalDateTime end = LocalDateTime.of(endOfMonth, LocalTime.MAX); return new LocalDateTime[]{start, end}; } /** * 获取今天日期字符串(yyyy-MM-dd) */ public static String getTodayDateString() { return LocalDate.now().format(DATE_FORMATTER); } /** * 获取现在日期时间字符串(yyyy-MM-dd HH:mm:ss) */ public static String getNowDateTimeString() { return LocalDateTime.now().format(DATETIME_FORMATTER); } /** * 获取近7天每天的日期列表(包括今天) * @return 日期字符串列表,格式:yyyy-MM-dd */ public static List getLast7DaysDateList() { return getDateList(7); } /** * 获取近30天每天的日期列表(包括今天) * @return 日期字符串列表,格式:yyyy-MM-dd */ public static List getLast30DaysDateList() { return getDateList(30); } /** * 获取指定天数的日期列表 * @param days 天数 * @return 日期字符串列表,格式:yyyy-MM-dd */ public static List getDateList(int days) { List dateList = new ArrayList<>(); LocalDate today = LocalDate.now(); for (int i = days - 1; i >= 0; i--) { LocalDate date = today.minusDays(i); dateList.add(date.format(DATE_FORMATTER)); } return dateList; } /** * 获取两个日期之间的所有日期列表 * @param startDate 开始日期 * @param endDate 结束日期 * @return 日期字符串列表,格式:yyyy-MM-dd */ public static List getDateRangeList(LocalDate startDate, LocalDate endDate) { List dateList = new ArrayList<>(); long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); for (long i = 0; i <= daysBetween; i++) { LocalDate date = startDate.plusDays(i); dateList.add(date.format(DATE_FORMATTER)); } return dateList; } /** * 格式化LocalDateTime为字符串 * @param dateTime 时间 * @return 格式化后的字符串 yyyy-MM-dd HH:mm:ss */ public static String formatDateTime(LocalDateTime dateTime) { return dateTime != null ? dateTime.format(DATETIME_FORMATTER) : null; } /** * 格式化LocalDate为字符串 * @param date 日期 * @return 格式化后的字符串 yyyy-MM-dd */ public static String formatDate(LocalDate date) { return date != null ? date.format(DATE_FORMATTER) : null; } /** * 字符串转LocalDateTime * @param dateTimeStr 时间字符串 yyyy-MM-dd HH:mm:ss */ public static LocalDateTime parseDateTime(String dateTimeStr) { return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER); } /** * 字符串转LocalDate * @param dateStr 日期字符串 yyyy-MM-dd */ public static LocalDate parseDate(String dateStr) { return LocalDate.parse(dateStr, DATE_FORMATTER); } /** * 获取指定日期的开始时间 * @param date 日期 * @return 当天的开始时间 */ public static LocalDateTime getStartOfDay(LocalDate date) { return LocalDateTime.of(date, LocalTime.MIN); } /** * 获取指定日期的结束时间 * @param date 日期 * @return 当天的结束时间 */ public static LocalDateTime getEndOfDay(LocalDate date) { return LocalDateTime.of(date, LocalTime.MAX); } /** * 获取指定日期的前n天 * @param date 基准日期 * @param days 天数 * @return 前n天的日期 */ public static LocalDate getDaysBefore(LocalDate date, int days) { return date.minusDays(days); } /** * 获取指定日期的后n天 * @param date 基准日期 * @param days 天数 * @return 后n天的日期 */ public static LocalDate getDaysAfter(LocalDate date, int days) { return date.plusDays(days); } }