400 lines
11 KiB
Java
400 lines
11 KiB
Java
package com.metis.utils;
|
||
|
||
import java.time.*;
|
||
import java.time.format.DateTimeFormatter;
|
||
import java.time.temporal.ChronoUnit;
|
||
import java.time.temporal.Temporal;
|
||
import java.time.temporal.TemporalAdjusters;
|
||
import java.time.temporal.TemporalUnit;
|
||
import java.util.Date;
|
||
|
||
/**
|
||
* 地方日期时间工具类
|
||
*
|
||
* @author ZhangQiang
|
||
* @date 2024/10/28
|
||
*/
|
||
public class LocalDateTimeUtils extends cn.hutool.core.date.LocalDateTimeUtil {
|
||
|
||
/**
|
||
* 在范围内
|
||
*
|
||
* @param target 目标
|
||
* @param start 开始
|
||
* @param end 结束
|
||
* @return boolean
|
||
*/
|
||
public static boolean isWithinRange(LocalDateTime target, LocalDateTime start, LocalDateTime end) {
|
||
return !target.isBefore(start) && !target.isAfter(end);
|
||
}
|
||
|
||
/**
|
||
* 现在时间在范围内
|
||
*
|
||
* @param start 开始
|
||
* @param end 结束
|
||
* @return boolean
|
||
*/
|
||
public static boolean nowIsWithinRange(LocalDateTime start, LocalDateTime end) {
|
||
LocalDateTime target = LocalDateTime.now();
|
||
return !target.isBefore(start) && !target.isAfter(end);
|
||
}
|
||
|
||
/**
|
||
* 获取指定时间是周几
|
||
*
|
||
* @param time 时间
|
||
* @return int
|
||
*/
|
||
public static int week(LocalDateTime time) {
|
||
return time.getDayOfWeek().getValue();
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取加或减N月的第一天
|
||
*
|
||
* @param num 数字
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime monthFirst(int num) {
|
||
LocalDateTime newTime = plus(LocalDateTime.now(), num, ChronoUnit.MONTHS);
|
||
newTime = newTime.with(TemporalAdjusters.firstDayOfMonth());
|
||
return getDayStart(newTime);
|
||
}
|
||
|
||
/**
|
||
* 获取加或减N月的最后天
|
||
*
|
||
* @param num 数字
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime monthLast(int num) {
|
||
LocalDateTime newTime = plus(LocalDateTime.now(), num, ChronoUnit.MONTHS);
|
||
newTime = newTime.with(TemporalAdjusters.lastDayOfMonth());
|
||
return getDayEnd(newTime);
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取加或减N周的第一天
|
||
*
|
||
* @param num 数字
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime weekFirst(int num) {
|
||
int week = week(LocalDateTime.now());
|
||
LocalDateTime newTime = subtract(LocalDateTime.now(), week - 1, ChronoUnit.DAYS);
|
||
newTime = plus(newTime, num * 7L, ChronoUnit.DAYS);
|
||
return getDayStart(newTime);
|
||
}
|
||
|
||
/**
|
||
* 获取加或减N周的最后一天
|
||
*
|
||
* @param num 数字
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime weekLast(int num) {
|
||
int week = week(LocalDateTime.now());
|
||
LocalDateTime newTime = plus(LocalDateTime.now(), 7 - week, ChronoUnit.DAYS);
|
||
newTime = plus(newTime, num * 7L, ChronoUnit.DAYS);
|
||
return getDayEnd(newTime);
|
||
}
|
||
|
||
|
||
/**
|
||
* 判断时间 ==> t1 < t2 = true (2019-10-13 11:11:00 < 2020-11-13 13:13:00 = true)
|
||
*
|
||
* @param t1 t1
|
||
* @param t2 t2
|
||
* @return boolean
|
||
*/
|
||
public static boolean isBefore(LocalDateTime t1, LocalDateTime t2) {
|
||
return t1.isBefore(t2);
|
||
}
|
||
|
||
/**
|
||
* 判断时间 ==> t1 > t2 = true(2019-10-13 11:11:00 > 2020-11-13 13:13:00 = false)
|
||
*
|
||
* @param t1 t1
|
||
* @param t2 t2
|
||
* @return boolean
|
||
*/
|
||
public static boolean isAfter(LocalDateTime t1, LocalDateTime t2) {
|
||
return t1.isAfter(t2);
|
||
}
|
||
|
||
/**
|
||
* Date 转 LocalDateTime
|
||
*
|
||
* @param date 日期
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime convertToLocalDateTime(Date date) {
|
||
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
|
||
}
|
||
|
||
/**
|
||
* LocalDateTime 转 Date
|
||
*
|
||
* @param time 时间
|
||
* @return {@link Date}
|
||
*/
|
||
public static Date convertToDate(LocalDateTime time) {
|
||
return Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
|
||
}
|
||
|
||
/**
|
||
* Date转LocalDate
|
||
*
|
||
* @param date 日期
|
||
* @return {@link LocalDate}
|
||
*/
|
||
public static LocalDate convertLocalDate(Date date) {
|
||
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
||
}
|
||
|
||
/**
|
||
* Date转LocalDate
|
||
*
|
||
* @param date 日期
|
||
* @return {@link LocalTime}
|
||
*/
|
||
public static LocalTime convertLocalTime(Date date) {
|
||
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取指定日期的毫秒
|
||
*
|
||
* @param time 时间
|
||
* @return {@link Long}
|
||
*/
|
||
public static Long getMilliByTime(LocalDateTime time) {
|
||
return time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
||
}
|
||
|
||
/**
|
||
* 获取秒数通过时间
|
||
* 获取指定日期的秒
|
||
*
|
||
* @param time 时间
|
||
* @return {@link Long}
|
||
*/
|
||
public static Long getSecondsByTime(LocalDateTime time) {
|
||
return time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
|
||
}
|
||
|
||
/**
|
||
* 获取指定时间的指定格式 ==> yyyy-MM-dd HH:mm:ss:SSS (HH是24小时制,而hh是12小时制, ss是秒,SSS是毫秒)
|
||
*
|
||
* @param time 时间
|
||
* @param pattern 图案
|
||
* @return {@link String}
|
||
*/
|
||
public static String formatTime(LocalDateTime time, String pattern) {
|
||
return time.format(DateTimeFormatter.ofPattern(pattern));
|
||
}
|
||
|
||
/**
|
||
* 日期加上一个数,根据field不同加不同值,field为ChronoUnit.*
|
||
*
|
||
* @param time 时间
|
||
* @param number 数
|
||
* @param field 领域
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) {
|
||
return time.plus(number, field);
|
||
}
|
||
|
||
/**
|
||
* 减去
|
||
* 日期减去一个数,根据field不同减不同值,field参数为ChronoUnit.*
|
||
*
|
||
* @param time 时间
|
||
* @param number 数
|
||
* @param field 领域
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime subtract(LocalDateTime time, long number, TemporalUnit field) {
|
||
return time.minus(number, field);
|
||
}
|
||
|
||
/**
|
||
* 获取白天开始
|
||
* 获取指定某一天的开始时间 00:00:00
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getDayStart(LocalDateTime time) {
|
||
return time.withHour(0)
|
||
.withMinute(0)
|
||
.withSecond(0)
|
||
.withNano(0);
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取白天结束
|
||
* 获取指定某一天的结束时间 23:59:59.999
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getDayEnd(LocalDateTime time) {
|
||
return time.withHour(23)
|
||
.withMinute(59)
|
||
.withSecond(59)
|
||
.withNano(999999999);
|
||
}
|
||
|
||
/**
|
||
* 获取本周周一
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getWeekOfFirst(LocalDateTime time) {
|
||
return time.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).
|
||
plusDays(1).withHour(0).withMinute(0).withSecond(0);
|
||
}
|
||
|
||
/**
|
||
* 获取本周周日
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getWeekOfLast(LocalDateTime time) {
|
||
return time.with(TemporalAdjusters.next(DayOfWeek.MONDAY)).
|
||
minusDays(1).withHour(23).withMinute(59).withSecond(59);
|
||
}
|
||
|
||
/**
|
||
* 获取本月第一天
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getMonthOfFirst(LocalDateTime time) {
|
||
LocalDateTime firsthand = time.with(TemporalAdjusters.firstDayOfMonth());
|
||
return LocalDateTime.of(firsthand.toLocalDate(), LocalTime.MIN);
|
||
}
|
||
|
||
/**
|
||
* 获取本月最后一天
|
||
*
|
||
* @param time 时间
|
||
* @return {@link LocalDateTime}
|
||
*/
|
||
public static LocalDateTime getMonthOfLast(LocalDateTime time) {
|
||
LocalDateTime lastDay = time.with(TemporalAdjusters.lastDayOfMonth());
|
||
return LocalDateTime.of(lastDay.toLocalDate(), LocalTime.MAX);
|
||
}
|
||
|
||
/**
|
||
* 日期相隔天数
|
||
*
|
||
* @param startDateInclusive 开始日期(含)
|
||
* @param endDateExclusive 结束日期除外
|
||
* @return int
|
||
*/
|
||
public static int periodDays(LocalDate startDateInclusive, LocalDate endDateExclusive) {
|
||
return Period.between(startDateInclusive, endDateExclusive).getDays();
|
||
}
|
||
|
||
/**
|
||
* 日期相隔小时
|
||
*
|
||
* @param startInclusive 开始包容性
|
||
* @param endExclusive 结束独家
|
||
* @return long
|
||
*/
|
||
public static long durationHours(Temporal startInclusive, Temporal endExclusive) {
|
||
return Duration.between(startInclusive, endExclusive).toHours();
|
||
}
|
||
|
||
|
||
/**
|
||
* 日期相隔分钟
|
||
*
|
||
* @param startInclusive 开始包容性
|
||
* @param endExclusive 结束独家
|
||
* @return long
|
||
*/
|
||
public static long durationMinutes(Temporal startInclusive, Temporal endExclusive) {
|
||
return Duration.between(startInclusive, endExclusive).toMinutes();
|
||
}
|
||
|
||
|
||
/**
|
||
* 持续时间秒
|
||
*
|
||
* @param startInclusive 开始包容
|
||
* @param endExclusive 结束独家
|
||
* @return long
|
||
*/
|
||
public static long durationSeconds(Temporal startInclusive, Temporal endExclusive) {
|
||
return Duration.between(startInclusive, endExclusive).toSeconds();
|
||
}
|
||
|
||
/**
|
||
* 日期相隔毫秒数
|
||
*
|
||
* @param startInclusive 开始包容性
|
||
* @param endExclusive 结束独家
|
||
* @return long
|
||
*/
|
||
public static long durationMillis(Temporal startInclusive, Temporal endExclusive) {
|
||
return Duration.between(startInclusive, endExclusive).toMillis();
|
||
}
|
||
|
||
/**
|
||
* 是否当天
|
||
*/
|
||
public static boolean isToday(LocalDate date) {
|
||
return LocalDate.now().equals(date);
|
||
}
|
||
|
||
|
||
/**
|
||
* 判断两个时间是否相差指定时间(精确到毫秒)
|
||
*
|
||
* @param time1 第一个时间点
|
||
* @param time2 第二个时间点
|
||
* @param milliseconds 指定时间差(毫秒)
|
||
* @return true 如果两个时间相差超过指定毫秒数,否则 false
|
||
*/
|
||
public static boolean isTimeDifferenceExceeds(LocalDateTime time1, LocalDateTime time2, long milliseconds) {
|
||
if (time1 == null || time2 == null) {
|
||
throw new IllegalArgumentException("Time arguments cannot be null");
|
||
}
|
||
|
||
Duration duration = Duration.between(time1, time2);
|
||
return Math.abs(duration.toMillis()) > milliseconds;
|
||
}
|
||
|
||
/**
|
||
* 判断指定时间是否与当前时间相差超过 24 小时(精确到毫秒)
|
||
*
|
||
* @param targetTime 指定的 LocalDateTime 时间
|
||
* @return true 如果相差 24 小时以上,否则 false
|
||
*/
|
||
public static boolean isMoreThan24HoursApart(LocalDateTime targetTime) {
|
||
if (targetTime == null) {
|
||
throw new IllegalArgumentException("Target time cannot be null");
|
||
}
|
||
// 比较时间差的绝对值是否大于 24 小时
|
||
return isTimeDifferenceExceeds(LocalDateTime.now(), targetTime, 86400000L);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|