301 lines
8.3 KiB
Java
301 lines
8.3 KiB
Java
package com.sgcc.utils;
|
||
|
||
import java.lang.management.ManagementFactory;
|
||
import java.text.ParseException;
|
||
import java.text.SimpleDateFormat;
|
||
import java.time.Duration;
|
||
import java.time.Instant;
|
||
import java.time.LocalDate;
|
||
import java.time.LocalDateTime;
|
||
import java.time.LocalTime;
|
||
import java.time.ZoneId;
|
||
import java.time.ZonedDateTime;
|
||
import java.util.Date;
|
||
import org.apache.commons.lang3.time.DateFormatUtils;
|
||
|
||
/**
|
||
* 时间日期工具类
|
||
*
|
||
* @author zhaoyuanyuan
|
||
* @version 1.0.0
|
||
* @date 2024/07/23 14:24
|
||
*/
|
||
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
||
|
||
public static final String YYYY = "yyyy";
|
||
|
||
public static final String YYYY_MM = "yyyy-MM";
|
||
|
||
public static final String YYYY_MM_DD = "yyyy-MM-dd";
|
||
|
||
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
||
|
||
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
|
||
|
||
private static final 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 {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:25
|
||
*/
|
||
public static Date getNowDate() {
|
||
return new Date();
|
||
}
|
||
|
||
/**
|
||
* 获取当前Date型日期 YYYY_MM_DD
|
||
*
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:25
|
||
*/
|
||
public static String getDate() {
|
||
return dateTimeNow(YYYY_MM_DD);
|
||
}
|
||
|
||
/**
|
||
* 获取当前Date型日期 YYYY_MM_DD_HH_MM_SS
|
||
*
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:25
|
||
*/
|
||
public static final String getTime() {
|
||
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
|
||
}
|
||
|
||
/**
|
||
* 获取当前Date型日期 YYYYMMDDHHMMSS
|
||
*
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:25
|
||
*/
|
||
public static final String dateTimeNow() {
|
||
return dateTimeNow(YYYYMMDDHHMMSS);
|
||
}
|
||
|
||
/**
|
||
* 获取当前Date型日期 format
|
||
*
|
||
* @param format 格式化类型
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:25
|
||
*/
|
||
public static final String dateTimeNow(final String format) {
|
||
return parseDateToStr(format, new Date());
|
||
}
|
||
|
||
/**
|
||
* 获取Date型日期 YYYY_MM_DD
|
||
*
|
||
* @param date
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:26
|
||
*/
|
||
public static final String dateTime(final Date date) {
|
||
return parseDateToStr(YYYY_MM_DD, date);
|
||
}
|
||
|
||
/**
|
||
* 将Date型日期转换为format型字符串
|
||
*
|
||
* @param format 格式化类型
|
||
* @param date 日期
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:26
|
||
*/
|
||
public static final String parseDateToStr(final String format, final Date date) {
|
||
return new SimpleDateFormat(format).format(date);
|
||
}
|
||
|
||
/**
|
||
* 获取Date型日期 format
|
||
*
|
||
* @param format 格式化类型
|
||
* @param ts 日期字符串
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:27
|
||
*/
|
||
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);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 日期路径 即年/月/日 如2024/08/08
|
||
*
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:27
|
||
*/
|
||
public static final String datePath() {
|
||
Date now = new Date();
|
||
return DateFormatUtils.format(now, "yyyy/MM/dd");
|
||
}
|
||
|
||
/**
|
||
* 日期路径 即年/月/日 如20240808
|
||
*
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:27
|
||
*/
|
||
public static final String dateTime() {
|
||
Date now = new Date();
|
||
return DateFormatUtils.format(now, "yyyyMMdd");
|
||
}
|
||
|
||
/**
|
||
* 日期型字符串转化为日期格式
|
||
*
|
||
* @param str
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:28
|
||
*/
|
||
public static Date parseDate(Object str) {
|
||
if (str == null) {
|
||
return null;
|
||
}
|
||
try {
|
||
return parseDate(str.toString(), parsePatterns);
|
||
} catch (ParseException e) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取服务器启动时间
|
||
*
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:28
|
||
*/
|
||
public static Date getServerStartDate() {
|
||
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
|
||
return new Date(time);
|
||
}
|
||
|
||
/**
|
||
* 计算相差天数
|
||
*
|
||
* @param date1 开始日期
|
||
* @param date2 结束日期
|
||
* @return int
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:28
|
||
*/
|
||
public static int differentDaysByMillisecond(Date date1, Date date2) {
|
||
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
|
||
}
|
||
|
||
/**
|
||
* 计算两个时间差
|
||
*
|
||
* @param startDate 开始日期
|
||
* @param endDate 结束日期
|
||
* @return {@code String }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:30
|
||
*/
|
||
public static String getDatePoor(Date startDate, Date endDate) {
|
||
long nd = 1000 * 24 * 60 * 60;
|
||
long nh = 1000 * 60 * 60;
|
||
long nm = 1000 * 60;
|
||
// long ns = 1000;
|
||
// 获得两个时间的毫秒时间差异
|
||
long diff = startDate.getTime() - endDate.getTime();
|
||
// 计算差多少天
|
||
long day = diff / nd;
|
||
// 计算差多少小时
|
||
long hour = diff % nd / nh;
|
||
// 计算差多少分钟
|
||
long min = diff % nd % nh / nm;
|
||
//输出结果
|
||
return day + "天" + hour + "小时" + min + "分钟";
|
||
}
|
||
|
||
/**
|
||
* 将 LocalDateTime 对象转换为 Date 对象
|
||
*
|
||
* @param temporalAccessor LocalDateTime 实例
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:30
|
||
*/
|
||
public static Date toDate(LocalDateTime temporalAccessor) {
|
||
// 将 LocalDateTime 转换为系统默认时区的 ZonedDateTime
|
||
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
|
||
// 使用 ZonedDateTime 的瞬时时间创建 Date 对象
|
||
return Date.from(zdt.toInstant());
|
||
}
|
||
|
||
/**
|
||
* 将 LocalDate 对象转换为 Date 对象
|
||
*
|
||
* @param temporalAccessor LocalDate 实例
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:30
|
||
*/
|
||
public static Date toDate(LocalDate temporalAccessor) {
|
||
// 将 LocalDate 转换为 LocalDateTime,时间为 00:00:00
|
||
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
|
||
// 将 LocalDateTime 转换为系统默认时区的 ZonedDateTime
|
||
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
|
||
// 使用 ZonedDateTime 的瞬时时间创建 Date 对象
|
||
return Date.from(zdt.toInstant());
|
||
}
|
||
|
||
/**
|
||
* 判断传入日期是否在系统当前日期之后
|
||
*
|
||
* @param date 日期
|
||
* @return boolean
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/23 14:34
|
||
*/
|
||
public static boolean isGreaterThanNow(Date date) {
|
||
Date nowDate = new Date();
|
||
int compareResult = date.compareTo(nowDate);
|
||
if (compareResult > 0) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取指定日期特定分钟数后的日期
|
||
*
|
||
* @param date 指定日期
|
||
* @param minutes 分钟数
|
||
* @return {@code Date }
|
||
* @author zhaoyuanyuan
|
||
* @date 2024/07/31 16:50
|
||
*/
|
||
public static Date getMinutesAfterDate(Date date, Integer minutes) {
|
||
Instant instant = date.toInstant();
|
||
//转换为LocalDateTime
|
||
LocalDateTime specifiedDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
|
||
//在指定日期基础上,增加指定分钟数
|
||
LocalDateTime newDateTime = specifiedDateTime.plus(Duration.ofMinutes(minutes));
|
||
return toDate(newDateTime);
|
||
}
|
||
|
||
}
|