242 lines
7.3 KiB
Java
242 lines
7.3 KiB
Java
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<String> getLast7DaysDateList() {
|
||
return getDateList(7);
|
||
}
|
||
|
||
/**
|
||
* 获取近30天每天的日期列表(包括今天)
|
||
* @return 日期字符串列表,格式:yyyy-MM-dd
|
||
*/
|
||
public static List<String> getLast30DaysDateList() {
|
||
return getDateList(30);
|
||
}
|
||
|
||
/**
|
||
* 获取指定天数的日期列表
|
||
* @param days 天数
|
||
* @return 日期字符串列表,格式:yyyy-MM-dd
|
||
*/
|
||
public static List<String> getDateList(int days) {
|
||
List<String> 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<String> getDateRangeList(LocalDate startDate, LocalDate endDate) {
|
||
List<String> 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);
|
||
}
|
||
|
||
}
|