You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

317 lines
9.9 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.os.common.utils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import org.apache.commons.lang3.time.DateFormatUtils;
import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER;
/**
* 时间工具类
*
* @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";
public 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)));
}
/**
* 计算时间差
*
* @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());
}
/**
* 生成两个日期之间的每个时间点(支持小时、日、月、年)
* 假设:输入格式与粒度匹配:
* HOURS -> yyyy-MM-dd HH:mm:ss
* DAYS -> yyyy-MM-dd
* MONTHS -> yyyy-MM
* YEARS -> yyyy
*
* @param startDateStr 开始时间字符串
* @param endDateStr 结束时间字符串
* @param unit 时间粒度(支持 HOURS, DAYS, MONTHS, YEARS
*/
public static List<String> getTimeIntervals(String startDateStr, String endDateStr, String unit) {
String pattern;
int calendarField;
switch (unit) {
case "19":
pattern = "yyyy-MM-dd HH:mm:ss";
calendarField = Calendar.HOUR_OF_DAY;
break;
case "10":
pattern = "yyyy-MM-dd";
calendarField = Calendar.DAY_OF_MONTH;
break;
case "7":
pattern = "yyyy-MM";
calendarField = Calendar.MONTH;
break;
case "4":
pattern = "yyyy";
calendarField = Calendar.YEAR;
break;
default:
throw new IllegalArgumentException("Unsupported unit: " + unit);
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
List<String> intervals = new ArrayList<>();
try {
Calendar start = Calendar.getInstance();
start.setTime(sdf.parse(startDateStr));
Calendar end = Calendar.getInstance();
end.setTime(sdf.parse(endDateStr));
while (!start.after(end)) {
intervals.add(sdf.format(start.getTime()));
start.add(calendarField, 1);
}
} catch (ParseException e) {
throw new RuntimeException("日期解析失败: " + e.getMessage(), e);
}
return intervals;
}
/**
* 获取时间范围信息
* @return 包含各种时间范围的Map
*/
public static Map<String, String> getDateTimeRanges() {
Map<String, String> timeMap = new HashMap<>();
String nowDateTime = LocalDateTime.now()
.withMinute(0)
.withSecond(0)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"));
//当前时间
timeMap.put("currentTime", nowDateTime);
String lastYearDateTime = LocalDateTime.now()
.minusYears(1) // 关键修改减去1年
.withMinute(0)
.withSecond(0)
.withNano(0)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"));
timeMap.put("lastYearCurrentTime", lastYearDateTime);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
// 当天开始时间 (00:00:00)
LocalDateTime todayStart = now.toLocalDate().atStartOfDay();
timeMap.put("todayStart", todayStart.format(formatter));
// 当月开始时间 (当月1日 00:00:00)
LocalDateTime monthStart = now.withDayOfMonth(1).toLocalDate().atStartOfDay();
timeMap.put("monthStart", monthStart.format(formatter));
// 当年开始时间 (当年1月1日 00:00:00)
LocalDateTime yearStart = now.withDayOfYear(1).toLocalDate().atStartOfDay();
timeMap.put("yearStart", yearStart.format(formatter));
// 去年当天开始时间
LocalDateTime lastYearTodayStart = todayStart.minusYears(1);
timeMap.put("lastYearTodayStart", lastYearTodayStart.format(formatter));
// 去年当月开始时间
LocalDateTime lastYearMonthStart = monthStart.minusYears(1);
timeMap.put("lastYearMonthStart", lastYearMonthStart.format(formatter));
// 去年当年开始时间
LocalDateTime lastYearYearStart = yearStart.minusYears(1);
timeMap.put("lastYearYearStart", lastYearYearStart.format(formatter));
return timeMap;
}
/**
* 获取去年同时间的日期字符串
* @param dateTimeStr 格式必须为 "yyyy-MM-dd HH:mm:ss"
* @return 去年同时间的字符串,格式相同
*/
public static String getLastYearDateTime(String dateTimeStr) {
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析字符串为 LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter);
// 减去一年
LocalDateTime lastYearDateTime = dateTime.minusYears(1);
// 格式化为字符串返回
return lastYearDateTime.format(formatter);
}
}