高效能源监控管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

437 lines
14 KiB

package com.mh.common.utils;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
import com.mh.common.core.domain.vo.EnergyConsumptionVO;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import org.apache.commons.lang3.time.DateFormatUtils;
/**
* 时间工具类
*
* @author mh
*/
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";
private 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 类型的 curTime 转换为 LocalTime
*
* @param curTime 需要转换的 Date 对象
* @return 转换后的 LocalTime 对象
*/
public static LocalTime convertDateToLocalTime(Date curTime) {
// 将 Date 转换为 Instant
java.time.Instant instant = curTime.toInstant();
// 获取系统默认时区,或者指定其他时区,例如 ZoneId.of("UTC")
ZoneId zone = ZoneId.systemDefault();
// 将 Instant 转换为 LocalTime
return instant.atZone(zone).toLocalTime();
}
public static boolean isCurrentTimeInRange(Date startTimeStr, Date endTimeStr, Date curTime) {
LocalTime startTime = convertDateToLocalTime(startTimeStr);
LocalTime endTime = convertDateToLocalTime(endTimeStr);
LocalTime currentTime = convertDateToLocalTime(curTime);
if (startTime.equals(endTime)) {
// 开始和结束时间相同,视为全天范围内
return true;
} else if (endTime.isAfter(startTime)) {
// 时间段不跨天,判断当前时间是否在[startTime, endTime]区间内
return !currentTime.isBefore(startTime) && !currentTime.isAfter(endTime);
} else {
// 时间段跨天,判断当前时间是否在[startTime, 23:59:59.999999999]或[00:00:00, endTime]
return !currentTime.isBefore(startTime) || !currentTime.isAfter(endTime);
}
}
/**
* 获取当前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());
}
/*
* 获取同一个时间的上一个时间
* @param timerStr
* @return
*/
public static String yoyDate(String timerStr) {
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter timeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(timerStr, timeFormatter);
LocalDate localDate1 = localDate.minusYears(1);
return localDate1.format(timeFormatter1).concat(timerStr.substring(10));
}
/**
* 获取同一个时间的上一个时间
* @param timerStr
* @return
*/
public static String momDate(String timerStr, String timeType, String timeRange) {
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDate = LocalDateTime.parse(timerStr, timeFormatter);
LocalDateTime localDate1 = null;
switch (timeType) {
case "hour":
localDate1 = localDate.minusHours(1);
break;
case "day":
localDate1 = localDate.minusDays(1);
break;
case "month":
if ("end".equals(timeRange)) {
localDate1 = localDate.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
} else if ("start".equals(timeRange)) {
localDate1 = localDate.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
}
break;
case "year":
localDate1 = localDate.minusYears(1);
break;
}
assert localDate1 != null;
return localDate1.format(timeFormatter);
}
public static void energyDateChange(EnergyConsumptionVO vo) {
switch (vo.getTimeType()) {
case "day":
vo.setStartTime(vo.getStartTime().concat(" 00:00:00"));
vo.setEndTime(vo.getEndTime().concat(" 23:59:59"));
break;
case "month":
YearMonth yearMonth = YearMonth.parse(vo.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM"));
LocalDate firstDayOfMonth = yearMonth.atDay(1);
String firstDayOutput = firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
vo.setStartTime(firstDayOutput.concat(" 00:00:00"));
YearMonth yearMonth1 = YearMonth.parse(vo.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM"));
LocalDate firstDayOfMonth1 = yearMonth1.atEndOfMonth();
String firstDayOutput1 = firstDayOfMonth1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
vo.setEndTime(firstDayOutput1.concat(" 23:59:59"));
break;
case "year":
vo.setStartTime(vo.getStartTime().concat("-01-01 00:00:00"));
vo.setEndTime(vo.getEndTime().concat("-12-31 23:59:59"));
break;
default:
break;
}
}
public static void sysEnergyDateChange(EnergyQueryVO vo) {
switch (vo.getTimeType()) {
case "day":
vo.setStartTime(vo.getStartTime().concat(" 00:00:00"));
vo.setEndTime(vo.getEndTime().concat(" 23:59:59"));
break;
case "month":
YearMonth yearMonth = YearMonth.parse(vo.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM"));
LocalDate firstDayOfMonth = yearMonth.atDay(1);
String firstDayOutput = firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
vo.setStartTime(firstDayOutput.concat(" 00:00:00"));
YearMonth yearMonth1 = YearMonth.parse(vo.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM"));
LocalDate firstDayOfMonth1 = yearMonth1.atEndOfMonth();
String firstDayOutput1 = firstDayOfMonth1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
vo.setEndTime(firstDayOutput1.concat(" 23:59:59"));
break;
case "year":
vo.setStartTime(vo.getStartTime().concat("-01-01 00:00:00"));
vo.setEndTime(vo.getEndTime().concat("-12-31 23:59:59"));
break;
default:
break;
}
}
/**
* 计算时间差
* @param curTime
* @param lastTime
* @param type
* @return
*/
public static BigDecimal calcDate(Object curTime, Object lastTime, String type) {
String momDate = momDate((String) curTime, type, "");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
long curDateMillis = 0;
long lastTimeMillis = 0;
try {
LocalDateTime dateTime = LocalDateTime.parse(momDate, formatter);
curDateMillis = dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
LocalDateTime lastDateTime = LocalDateTime.parse((CharSequence) lastTime, formatter);
lastTimeMillis = lastDateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
} catch (Exception e) {
System.err.println("无法解析时间字符串: " + e.getMessage());
}
return (new BigDecimal(curDateMillis - lastTimeMillis)).divide(new BigDecimal(60),2, RoundingMode.HALF_UP);
}
public static String getTimeLen(String timeType) {
String timeLen = "";
switch (timeType) {
case "hour":
timeLen = "13";
break;
case "day":
timeLen = "10";
break;
case "month":
timeLen = "7";
break;
case "year":
timeLen = "4";
break;
}
return timeLen;
}
/**
* 把日期格式化为字符串
*
* @param date 日期
* @param format 格式
* @return 返回格式化之后的字符串
*/
public static Date stringToDate(String date, String format) {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
try {
return dateFormat.parse(date);
} catch (ParseException e) {
return null;
}
}
/**
* 获取每隔多少分钟的格式化时间
* 传入 date "2023-07-31 16:23:00" minuteInter 5分钟
* 返回 "2023-07-31 16:20:00" 整点
*
* @param date 时间
* @param minuteInterval 间隔
* @return 时间
*/
public static String getTimeMin(Date date, int minuteInterval) {
if (minuteInterval <= 0 || minuteInterval > 30) {
throw new RuntimeException("minute参数错误");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = null;
format = sdf.format(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int minute = calendar.get(Calendar.MINUTE);
int num = minute / minuteInterval;
String curDate = format.substring(0, 13) + ":" + (num * minuteInterval) + ":00";
// System.out.println("curDate = " + curDate);
return curDate;
}
/**
* 把日期格式化为字符串
*
* @param date 日期
* @param format 格式
* @return 返回格式化之后的字符串
*/
public static String dateToString(Date date, String format) {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
return dateFormat.format(date);
}
/**
* 时间格式转 yyyy-MM-dd'T'HH:mm:ssZ
* @return
*/
public static String dateToTsStr() {
// 获取当前时间
Instant now = Instant.now();
// 转换为ZonedDateTime并设置时区为UTC
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("UTC"));
// 创建DateTimeFormatter对象并设置格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
// 格式化日期
return zonedDateTime.format(formatter);
}
}