Files
jsowell-charger-web/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java

1188 lines
39 KiB
Java
Raw Normal View History

2023-03-04 16:29:55 +08:00
package com.jsowell.common.util;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.management.ManagementFactory;
import java.text.DateFormat;
2023-03-04 16:29:55 +08:00
import java.text.ParseException;
import java.text.SimpleDateFormat;
2023-08-17 16:10:31 +08:00
import java.time.*;
2023-03-04 16:29:55 +08:00
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
2023-07-22 15:23:31 +08:00
import java.util.*;
2023-03-04 16:29:55 +08:00
/**
* 时间工具类
*
* @author jsowell
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
static Logger log = LoggerFactory.getLogger(DateUtils.class);
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDD = "yyyyMMdd";
2024-05-13 11:00:16 +08:00
public static String YYMMDD = "yyMMdd";
2023-03-04 16:29:55 +08:00
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYYMMDDHHMM = "yyyyMMddHHmm";
public static String YYMMDDHHMMSS = "yyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
2024-06-18 16:26:12 +08:00
public static String HH_MM = "HH:mm";
2023-03-04 16:29:55 +08:00
public static String RFC3339 = "yyyy-MM-dd'T'HH:mm:ssXXX";
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型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
}
/**
* 获取昨天日期LocalDate
* @return
*/
public static LocalDate getYesterday() {
return LocalDate.now().plusDays(-1);
}
/**
* 获取昨天日期String
* @return
*/
public static String getYesterdayStr() {
LocalDate yesterday = getYesterday();
return yesterday.toString();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd HH:mm:ss
*
* @return String
*/
public static String getDateTime() {
2023-03-04 16:29:55 +08:00
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
/**
* 获取当前日期, 默认格式为yyyyMMddHHmmss
*
* @return String
*/
2023-03-04 16:29:55 +08:00
public static String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static String dateTimeNow(final String format) {
return parseDateToStr(format, new Date());
}
public static String dateTime(final Date date) {
return parseDateToStr(YYYY_MM_DD, date);
}
public static String parseDateToStr(final String format, final Date date) {
return new SimpleDateFormat(format).format(date);
}
public static String timeStampToRfc3339(long timeStamp) {
Date date = new Date(timeStamp);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(RFC3339);
String formatDate = simpleDateFormat.format(date);
return formatDate;
}
public static LocalDateTime toLocalDateTime(String str, String format) {
if (StringUtils.isBlank(str)) {
return null;
}
if (StringUtils.isBlank(format)) {
format = YYYY_MM_DD_HH_MM_SS;
}
DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
return LocalDateTime.parse(str, df);
}
public static 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 String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年// 如20180808
*/
public static 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);
}
/**
2023-06-01 10:39:48 +08:00
* 计算相差天数不会显示负值
*/
public static int differentDaysByMillisecond(Date beginDate, Date endDate) {
return Math.abs((int) ((endDate.getTime() - beginDate.getTime()) / (1000 * 3600 * 24)));
}
/**
* 计算相差天数 (会显示负值)
2023-06-05 16:30:26 +08:00
*
2023-06-01 10:39:48 +08:00
* @param endDate
* @param nowDate
* @return
2023-03-04 16:29:55 +08:00
*/
2023-06-01 10:39:48 +08:00
public static String getPoorDays(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long diff = endDate.getTime() - nowDate.getTime();
long day = diff / nd;
StringBuilder sb = new StringBuilder();
if (day != 0) {
sb.append(day);
}
return sb.toString();
2023-03-04 16:29:55 +08:00
}
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
long sec = diff % nd % nh % nm / ns;
StringBuilder sb = new StringBuilder();
if (day != 0) {
sb.append(day).append("");
}
if (hour != 0) {
sb.append(hour).append("小时");
}
if (min != 0) {
sb.append(min).append("");
}
if (sec != 0) {
sb.append(sec).append("");
}
return sb.toString();
}
2024-09-20 13:57:41 +08:00
/**
* 计算从给定日期字符串到当前时间一共过去了多少分钟
*
* @param dateString 给定的日期字符串格式为 "yyyy-MM-dd HH:mm:ss"
* @return 过去的分钟数
*/
public static long minutesSince(String dateString) {
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析给定的日期字符串
LocalDateTime givenDateTime = LocalDateTime.parse(dateString, formatter);
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 计算两者之间的时间差
Duration duration = Duration.between(givenDateTime, now);
// 将时间差转换为分钟
long minutes = duration.toMinutes();
return minutes;
}
2023-03-04 16:29:55 +08:00
/**
* LocalDateTime转Date
*
* @param localDateTime
* @return
*/
public static Date localDateTime2Date(LocalDateTime localDateTime) {
if (localDateTime == null) {
return null;
}
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
public static Date localDate2Date(LocalDate localDate) {
if (localDate == null) {
return null;
}
LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.of(0, 0, 0));
return localDateTime2Date(localDateTime);
}
/**
* 字符串转localDate
* @param dateStr 格式"yyyy-MM-dd"
* @return
*/
public static LocalDate dateStr2LocalDate(String dateStr) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return LocalDate.parse(dateStr, fmt);
}
/**
2023-07-20 16:59:34 +08:00
* localDate转dateStr 直接 .toString()
* @param localDate
* @return 格式"yyyy-MM-dd"
*/
2023-07-20 16:59:34 +08:00
// public static String localDate2DateStr(LocalDate localDate) {
// DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// return localDate.format(df);
// }
2023-03-04 16:29:55 +08:00
/**
* Date转LocalDateTime
*/
public static LocalDateTime date2LocalDateTime(Date date) {
if (date == null) {
return null;
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
/**
* 获取云快充协议所需时间段
* 0 000 30 时段费率号
* 0 301 00 时段费率号
*
* 23 0023 30 时段费率号
* 23 300 00 时段费率号
*/
public static List<String> getPeriodOfTime() {
int intervalMinutes = 30;
// 结果集
List<String> resultList = Lists.newArrayList();
LocalTime startTime = LocalTime.of(0, 0);
LocalTime tempStartDateTime = startTime;
LocalTime tempEndDateTime = null;
while (true) {
// 获取加intervalMinutes分钟后的时间
tempEndDateTime = tempStartDateTime.plusMinutes(intervalMinutes);
resultList.add(tempStartDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")) +
"-" + tempEndDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")));
// 下次的开始时间,为上次的结束时间
tempStartDateTime = tempEndDateTime;
// 当tempStartDateTime等于startTime时停止
if (tempStartDateTime.compareTo(startTime) == 0) {
break;
}
}
// 特殊处理
resultList = resultList.subList(0, resultList.size() - 1);
// 每天的最后半小时
resultList.add("23:30:00-23:59:59");
return resultList;
}
/**
* 时分秒转LocalTime
* 可以是 10:10:23 或者 10:10
*
* @param time
* @return
*/
public static LocalTime getLocalTime(String time) {
if (StringUtils.equals("24:00", time)) {
// System.out.println("time为24:00, 转换为23:59");
time = "23:59";
}
List<String> list = Lists.newArrayList(time.split(":"));
if (CollectionUtils.isNotEmpty(list)) {
if (list.size() == 2) {
return LocalTime.of(Integer.parseInt(list.get(0)), Integer.parseInt(list.get(1)));
} else if (list.size() == 3) {
return LocalTime.of(Integer.parseInt(list.get(0)), Integer.parseInt(list.get(1)), Integer.parseInt(list.get(2)));
}
}
return null;
}
public enum IntervalType {
DAY,
HOUR,
MINUTE,
SECOND,
;
}
/**
* 时间切割
*
* @param startTime 被切割的开始时间
* @param endTime 被切割的结束时间
* @param intervalType
* @param interval >0
* @return
*/
public static List<DateSplit> splitDate(Date startTime, Date endTime, IntervalType intervalType, int interval) {
if (interval < 0) {
return null;
}
if (endTime.getTime() <= startTime.getTime()) {
return null;
}
if (intervalType == IntervalType.DAY) {
return splitByDay(startTime, endTime, interval);
}
if (intervalType == IntervalType.HOUR) {
return splitByHour(startTime, endTime, interval);
}
if (intervalType == IntervalType.MINUTE) {
return splitByMinute(startTime, endTime, interval);
}
if (intervalType == IntervalType.SECOND) {
return splitBySecond(startTime, endTime, interval);
}
return null;
}
/**
* 按照小时切割时间区间
*/
public static List<DateSplit> splitByHour(Date startTime, Date endTime, int intervalHours) {
if (endTime.getTime() <= startTime.getTime()) {
return null;
}
List<DateSplit> dateSplits = new ArrayList<>(256);
DateSplit param = new DateSplit();
param.setStartDateTime(startTime);
param.setEndDateTime(endTime);
param.setEndDateTime(addHour(startTime, intervalHours));
while (true) {
param.setStartDateTime(startTime);
Date tempEndTime = addHour(startTime, intervalHours);
if (tempEndTime.getTime() >= endTime.getTime()) {
tempEndTime = endTime;
}
param.setEndDateTime(tempEndTime);
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addHour(startTime, intervalHours);
if (startTime.getTime() >= endTime.getTime()) {
break;
}
if (param.getEndDateTime().getTime() >= endTime.getTime()) {
break;
}
}
return dateSplits;
}
/**
* 按照秒切割时间区间
* getRealTimeDetectionData
*/
public static List<DateSplit> splitBySecond(Date startTime, Date endTime, int intervalSeconds) {
if (endTime.getTime() <= startTime.getTime()) {
return null;
}
List<DateSplit> dateSplits = new ArrayList<>(256);
DateSplit param = new DateSplit();
param.setStartDateTime(startTime);
param.setEndDateTime(endTime);
param.setEndDateTime(addSecond(startTime, intervalSeconds));
while (true) {
param.setStartDateTime(startTime);
Date tempEndTime = addSecond(startTime, intervalSeconds);
if (tempEndTime.getTime() >= endTime.getTime()) {
tempEndTime = endTime;
}
param.setEndDateTime(tempEndTime);
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addSecond(startTime, intervalSeconds);
if (startTime.getTime() >= endTime.getTime()) {
break;
}
if (param.getEndDateTime().getTime() >= endTime.getTime()) {
break;
}
}
return dateSplits;
}
/**
* 按照天切割时间区间
*/
public static List<DateSplit> splitByDay(Date startTime, Date endTime, int intervalDays) {
if (endTime.getTime() <= startTime.getTime()) {
return null;
}
List<DateSplit> dateSplits = new ArrayList<>(256);
DateSplit param = new DateSplit();
param.setStartDateTime(startTime);
param.setEndDateTime(endTime);
param.setEndDateTime(addDay(startTime, intervalDays));
while (true) {
param.setStartDateTime(startTime);
Date tempEndTime = addDay(startTime, intervalDays);
if (tempEndTime.getTime() >= endTime.getTime()) {
tempEndTime = endTime;
}
param.setEndDateTime(tempEndTime);
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addDay(startTime, intervalDays);
if (startTime.getTime() >= endTime.getTime()) {
break;
}
if (param.getEndDateTime().getTime() >= endTime.getTime()) {
break;
}
}
return dateSplits;
}
/**
* 按照分钟切割时间区间
*
* @param startTime
* @param endTime
* @param intervalMinutes
* @return
*/
public static List<DateSplit> splitByMinute(Date startTime, Date endTime, int intervalMinutes) {
if (endTime.getTime() <= startTime.getTime()) {
return null;
}
List<DateSplit> dateSplits = new ArrayList<>(256);
DateSplit param = new DateSplit();
param.setStartDateTime(startTime);
param.setEndDateTime(endTime);
param.setEndDateTime(addMinute(startTime, intervalMinutes));
while (true) {
param.setStartDateTime(startTime);
Date tempEndTime = addMinute(startTime, intervalMinutes);
if (tempEndTime.getTime() >= endTime.getTime()) {
tempEndTime = endTime;
}
param.setEndDateTime(tempEndTime);
dateSplits.add(new DateSplit(param.getStartDateTime(), param.getEndDateTime()));
startTime = addMinute(startTime, intervalMinutes);
if (startTime.getTime() >= endTime.getTime()) {
break;
}
if (param.getEndDateTime().getTime() >= endTime.getTime()) {
break;
}
}
return dateSplits;
}
private static Date addDay(Date date, int days) {
return add(date, Calendar.DAY_OF_MONTH, days);
}
private static Date addHour(Date date, int hours) {
return add(date, Calendar.HOUR_OF_DAY, hours);
}
public static Date addMinute(Date date, int minute) {
return add(date, Calendar.MINUTE, minute);
}
private static Date addSecond(Date date, int second) {
return add(date, Calendar.SECOND, second);
}
private static Date add(final Date date, final int calendarField, final int amount) {
final Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(calendarField, amount);
return c.getTime();
}
public static String formatDateTime(Date date) {
if (date == null) {
return "";
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
return simpleDateFormat.format(date);
}
2023-06-05 16:30:26 +08:00
public static String formatDateTime(LocalDateTime localDateTime) {
if (localDateTime == null) {
return "";
}
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
return formatDateTime(date);
}
2024-07-01 09:56:47 +08:00
public static String formatDateTime(LocalTime localTime) {
if (localTime == null) {
return "";
}
return localTime.toString();
}
2023-03-04 16:29:55 +08:00
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class DateSplit {
private Date startDateTime;
private Date endDateTime;
public String getStartDateTimeStr() {
return formatDateTime(startDateTime);
}
public String getEndDateTimeStr() {
return formatDateTime(endDateTime);
}
}
/**
* CP56Time2a 日期字符串
* 0x3b交易记录 会使用这个方法解析开始时间 结束时间 交易时间
* @param bytes
* @return
*/
// public static String CP56Time2aToDateStr(byte[] bytes) {
// Date date = CP56Time2aToDate(bytes);
// if (date == null) {
// return null;
// }
// return DateUtils.formatDateTime(date);
// }
// public static String toDateString(byte[] bytes) {
// return Cp56Time2aUtil.toDateString(bytes);
// }
/**
* cp56time2a 格式转date格式
*/
// public static Date CP56Time2aToDate(byte[] bytes) {
// if (bytes == null || bytes.length != 7) {
// return null;
// }
// int ms = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 0, 2));
// int min = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 2, 1));
// int hour = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 3, 1));
// int day = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 4, 1));
// int month = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 5, 1));
// int year = BytesUtil.bytesToIntLittle(BytesUtil.copyBytes(bytes, 6, 1));
// if (month == 0 || day == 0 || year == 0) {
// return null;
// }
// LocalDateTime localDateTime = LocalDateTime.of(year + 2000, month, day, hour, min, ms / 1000);
// Date date = DateUtils.localDateTime2Date(localDateTime);
// return date;
// }
// public static Date CP56Time2aToDate(byte[] bytes) {
// return Cp56Time2aUtil.toDate(bytes);
// }
/**
* 时间转16进制字符串
* Date转成CP56Time2a
* 发送对时请求会用到这个方法
*/
// public static String encodeCP56Time2a(Date date) {
// // Calendar calendar = Calendar.getInstance();
// // calendar.setTime(date);
// // StringBuilder builder = new StringBuilder();
// // String milliSecond = String.format("%04X", (calendar.get(Calendar.SECOND) * 1000) + calendar.get(Calendar.MILLISECOND));
// // builder.append(milliSecond.substring(2, 4));
// // builder.append(milliSecond.substring(0, 2));
// // builder.append(String.format("%02X", calendar.get(Calendar.MINUTE) & 0x3F));
// // builder.append(String.format("%02X", calendar.get(Calendar.HOUR_OF_DAY) & 0x1F));
// // int week = calendar.get(Calendar.DAY_OF_WEEK);
// // if (week == Calendar.SUNDAY)
// // week = 7;
// // else week--;
// // builder.append(String.format("%02X", (week << 5) + (calendar.get(Calendar.DAY_OF_MONTH) & 0x1F)));
// // builder.append(String.format("%02X", calendar.get(Calendar.MONTH) + 1));
// // builder.append(String.format("%02X", calendar.get(Calendar.YEAR) - 2000));
// // return builder.toString();
//
// byte[] result = new byte[7];
// final Calendar aTime = Calendar.getInstance();
// aTime.setTime(date);
// final int milliseconds = aTime.get(Calendar.MILLISECOND);
// result[0] = (byte) (milliseconds % 256);
// result[1] = (byte) (milliseconds / 256);
// result[2] = (byte) aTime.get(Calendar.MINUTE);
// result[3] = (byte) aTime.get(Calendar.HOUR_OF_DAY);
// result[4] = (byte) aTime.get(Calendar.DAY_OF_MONTH);
// result[5] = (byte) (aTime.get(Calendar.MONTH) + 1);
// result[6] = (byte) (aTime.get(Calendar.YEAR) % 100);
// System.out.println("Year->" + aTime.get(Calendar.YEAR));
// return BytesUtil.binary(result, 16);
// }
// public static String date2HexStr(Date date) {
// return Cp56Time2aUtil.date2HexStr(date);
// }
/**
* 获取两个时间的间隔时间
*
* @return 间隔时间 单位分钟
*/
public static long intervalTime(String begin, String end) {
return intervalTime(parseDate(begin), parseDate(end));
}
/**
* 获取两个时间的间隔时间
*
* @return 间隔时间 单位分钟
*/
public static long intervalTime(Date begin, Date end) {
return intervalTime(date2LocalDateTime(begin), date2LocalDateTime(end));
}
/**
* 获取两个时间的间隔时间
*
* @return 间隔时间 单位分钟
*/
public static long intervalTime(LocalDateTime begin, LocalDateTime end) {
return ChronoUnit.MINUTES.between(begin, end);
}
/**
* 判断2个时间段是否有重叠交集
*
* @param startDate1 时间段1开始时间戳
* @param endDate1 时间段1结束时间戳
* @param startDate2 时间段2开始时间戳
* @param endDate2 时间段2结束时间戳
* @param isStrict 是否严格重叠true 严格没有任何相交或相等false 不严格可以首尾相等比如2021/5/29-2021/5/31和2021/5/31-2021/6/1不重叠
* @return 返回是否重叠
*/
public static boolean isOverlap(long startDate1, long endDate1, long startDate2, long endDate2, boolean isStrict) {
if (isStrict) {
if (!(endDate1 < startDate2 || startDate1 > endDate2)) {
return true;
}
} else {
if (!(endDate1 <= startDate2 || startDate1 >= endDate2)) {
return true;
}
}
return false;
}
/**
* @param time1 17:02:00 - 17:02:00
* @param time2 00:00-06:30
* @return
*/
public static boolean checkTime(String time1, String time2) {
String[] split = time1.split("-");
LocalTime startTime1 = DateUtils.getLocalTime(split[0]);
LocalTime endTime1 = DateUtils.getLocalTime(split[1]);
String[] split2 = time2.split("-");
LocalTime startTime2 = DateUtils.getLocalTime(split2[0]);
LocalTime endTime2 = DateUtils.getLocalTime(split2[1]);
return DateUtils.isOverlap(startTime1, endTime1, startTime2, endTime2, false);
}
/**
* 判断时间段是否重叠
*
* @param startDate1
* @param endDate1
* @param startDate2
* @param endDate2
* @param isStrict
* @return
*/
public static boolean isOverlap(LocalTime startDate1, LocalTime endDate1, LocalTime startDate2, LocalTime endDate2, boolean isStrict) {
if (startDate1 == null || endDate1 == null || startDate2 == null || endDate2 == null) {
log.warn("判断时间段是否重叠缺少参数返回false");
return false;
}
boolean result = false;
if (isStrict) {
if (!(endDate1.isBefore(startDate2) || startDate1.isAfter(endDate2))) {
result = true;
}
} else {
if (!((endDate1.isBefore(startDate2) || endDate1.equals(startDate2)) || (startDate1.isAfter(endDate2) || startDate1.equals(endDate2)))) {
result = true;
}
}
// log.info("时间段1={}, 时间段2={}, 结果:{}", startDate1 + "-" + endDate1, startDate2 + "-" + endDate2, result);
return result;
}
/**
* 判断2个时间段是否有重叠交集
*
* @param startDate1 时间段1开始时间
* @param endDate1 时间段1结束时间
* @param startDate2 时间段2开始时间
* @param endDate2 时间段2结束时间
* @param isStrict 是否严格重叠true 严格没有任何相交或相等false 不严格可以首尾相等比如2021-05-29到2021-05-31和2021-05-31到2021-06-01不重叠
* @return 返回是否重叠
*/
public static boolean isOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2, boolean isStrict) {
Objects.requireNonNull(startDate1, "startDate1");
Objects.requireNonNull(endDate1, "endDate1");
Objects.requireNonNull(startDate2, "startDate2");
Objects.requireNonNull(endDate2, "endDate2");
return isOverlap(startDate1.getTime(), endDate1.getTime(), startDate2.getTime(), endDate2.getTime(), isStrict);
}
/**
* 天时分秒
2023-06-05 16:30:26 +08:00
* 时分秒HoursMinutesSeconds
2023-03-04 16:29:55 +08:00
*
* @param mss 秒数
* @return xx天xx小时xx分钟xx秒
*/
2023-06-05 16:30:26 +08:00
public static String formatHoursMinutesSeconds(long mss) {
2023-03-04 16:29:55 +08:00
String DateTimes = null;
long days = mss / (60 * 60 * 24);
long hours = (mss % (60 * 60 * 24)) / (60 * 60);
long minutes = (mss % (60 * 60)) / 60;
long seconds = mss % 60;
if (days > 0) {
DateTimes = days + "" + hours + "小时" + minutes + "分钟"
+ seconds + "";
} else if (hours > 0) {
DateTimes = hours + "小时" + minutes + "分钟"
+ seconds + "";
} else if (minutes > 0) {
DateTimes = minutes + "分钟"
+ seconds + "";
} else {
DateTimes = seconds + "";
}
return DateTimes;
}
/**
* 分钟转 x时x分
* @param minutes
* @return
*/
public static String convertMinutesToTime(int minutes) {
if (minutes < 0) {
return null;
}
int hours = minutes / 60;
int remainingMinutes = minutes % 60;
if (hours < 1) {
return String.format("%d分钟", remainingMinutes);
}else {
return String.format("%d小时%d分钟", hours, remainingMinutes);
}
}
2023-03-04 16:29:55 +08:00
/**
* 当前时间是否在时间指定范围内<br>
*
* @param time 被检查的时间
* @param beginTime 起始时间
* @param endTime 结束时间
* @return 是否在范围内
* @since 3.0.8
*/
public static boolean isIn(LocalTime time, LocalTime beginTime, LocalTime endTime) {
// 判断是否在范围内 包含开始结束时间
if (time.compareTo(beginTime) == 0 || time.compareTo(endTime) == 0) {
return true;
}
2023-06-05 16:30:26 +08:00
if (beginTime.isBefore(time) && endTime.isAfter(time)) {
2023-03-04 16:29:55 +08:00
return true;
}
return false;
}
/**
* 根据传入的日期,获取时间区间中所有的日期
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return java.util.List<java.time.LocalDate>
* @since 2023-07-20
*/
public static List<LocalDate> getAllDatesInTheDateRange(LocalDate startDate, LocalDate endDate) {
List<LocalDate> localDateList = new ArrayList<>();
// 开始时间必须小于结束时间
if (startDate.isAfter(endDate)) {
return null;
}
while (startDate.isBefore(endDate)) {
localDateList.add(startDate);
startDate = startDate.plusDays(1);
}
localDateList.add(endDate);
return localDateList;
}
/**
* 根据传入的日期,获取时间区间中所有的日期
* @param startDate 开始日期
* @param endDate 结束日期
* @return java.util.List<String>
*/
public static List<String> getAllDatesInTheDateRange(String startDate, String endDate) {
// 判断传进来的日期格式
if (judgeLegalDate(startDate) || judgeLegalDate(endDate)) {
return new ArrayList<>();
}
List<LocalDate> localDateList = getAllDatesInTheDateRange(dateStr2LocalDate(startDate), dateStr2LocalDate(endDate));
if (CollectionUtils.isEmpty(localDateList)) {
return new ArrayList<>();
}
List<String> resultList = new ArrayList<>();
localDateList.forEach(localDate -> {
2023-07-20 16:59:34 +08:00
String dateStr = localDate.toString();
resultList.add(dateStr);
});
return resultList;
}
/**
* 判断时间格式 格式必须为YYYY-MM-dd
* 2004-2-30 是无效的
* 2003-2-29 是无效的
* @param sDate
* @return
*/
private static boolean judgeLegalDate(String sDate) {
int legalLen = 10;
if ((sDate == null) || (sDate.length() != legalLen)) {
return true;
}
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = formatter.parse(sDate);
return !sDate.equals(formatter.format(date));
} catch (Exception e) {
return true;
}
}
2023-07-22 15:23:31 +08:00
/**
* 根据年月获取月初第一天日期
* @param year
* @param month
* @return
*/
public static String getFirstDay(int year,int month,String format) {
Calendar cale = Calendar.getInstance();
cale.set(Calendar.YEAR, year); //赋值年份
cale.set(Calendar.MONTH, month - 1);//赋值月份
int lastDay = cale.getActualMinimum(Calendar.DAY_OF_MONTH);//获取月最大天数
cale.set(Calendar.DAY_OF_MONTH, lastDay);//设置日历中月份的最大天数
SimpleDateFormat sdf = new SimpleDateFormat(format);//格式化日期yyyy-MM-dd
String lastDayOfMonth = sdf.format(cale.getTime());
return lastDayOfMonth;
}
/**
* 根据年月获取月末最后一天日期
* @param year
* @param month
* @return
*/
public static String getLastDay(int year,int month,String format) {
Calendar cale = Calendar.getInstance();
cale.set(Calendar.YEAR, year);//赋值年份
cale.set(Calendar.MONTH, month - 1);//赋值月份
int lastDay = cale.getActualMaximum(Calendar.DAY_OF_MONTH);//获取月最大天数
cale.set(Calendar.DAY_OF_MONTH, lastDay);//设置日历中月份的最大天数
SimpleDateFormat sdf = new SimpleDateFormat(format); //格式化日期yyyy-MM-dd
String lastDayOfMonth = sdf.format(cale.getTime());
return lastDayOfMonth;
}
2023-08-17 16:10:31 +08:00
/**
* 时间戳 LocalDateTime
* @param timestamp 时间戳单位毫秒
* @return
*/
public static LocalDateTime timestampToDatetime(long timestamp){
Instant instant = Instant.ofEpochMilli(timestamp);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
2023-10-24 11:09:04 +08:00
/**
* LocalDateTime转时间戳
* @param localDateTime
* @return
*/
2023-08-17 16:10:31 +08:00
public static long datetimeToTimestamp(LocalDateTime localDateTime){
2023-10-24 11:09:04 +08:00
return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* date转时间戳
*/
public static long dateToTimestamp(Date date){
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
return datetimeToTimestamp(localDateTime);
}
/**
* date字符串转时间戳
* @param dateStr
* @return
*/
public static long dateStrToTimestamp(String dateStr) {
Date date = parseDate(dateStr);
return dateToTimestamp(date);
2023-08-17 16:10:31 +08:00
}
2023-10-20 18:10:52 +08:00
2023-10-24 11:09:04 +08:00
2023-10-20 18:10:52 +08:00
/**
* YYYY-MM-DD HH:mm:ss 转换为 YYYY-MM-DD
* @param dateTimeString
* @return
*/
public static String convertDateTimeToDate(String dateTimeString) {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = inputFormat.parse(dateTimeString);
return outputFormat.format(date);
} catch (ParseException e) {
// 处理解析异常
e.printStackTrace();
return null; // 或者返回一个默认值
}
}
/**
* 返回多个Date参数中不为null并且时间最大的Date
*
* @param dates 多个Date类型的参数
* @return 参数列表中不为null且时间最大的Date对象
*/
public static Date getMaxDate(Date... dates) {
Date maxDate = null;
for (Date date : dates) {
if (date != null && (maxDate == null || date.after(maxDate))) {
maxDate = date;
}
}
return maxDate;
}
2024-06-19 09:00:06 +08:00
public static LocalDateTime convertToLocalDateTime(String time, boolean isNextDay) {
LocalTime localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("HH:mm:ss"));
LocalDateTime now = LocalDateTime.now();
LocalDateTime dateTime = now.with(localTime);
if (isNextDay) {
dateTime = dateTime.plusDays(1);
}
return dateTime;
}
/**
* 转换预约时间
* @param startTime
* @param endTime
* @return
*/
public static LocalDateTime[] convertStartAndEndTime(String startTime, String endTime) {
LocalTime startLocalTime = LocalTime.parse(startTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
LocalTime endLocalTime = LocalTime.parse(endTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
LocalDateTime now = LocalDateTime.now();
LocalDateTime startDateTime = now.with(startLocalTime);
LocalDateTime endDateTime = now.with(endLocalTime);
// 如果结束时间比开始时间小或相同,则结束时间为第二天
if (endLocalTime.isBefore(startLocalTime) || endLocalTime.equals(startLocalTime)) {
endDateTime = endDateTime.plusDays(1);
}
return new LocalDateTime[]{startDateTime, endDateTime};
}
/**
* 获取去年这个月第一天的日期
* @return 去年这个月第一天的日期格式为 "yyyy-MM-dd"
*/
public static String getFirstDayOfLastYearMonth() {
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取去年这个月的年份
int lastYear = currentDate.getYear() - 1;
// 获取这个月的月份
int currentMonth = currentDate.getMonthValue();
// 获取去年这个月第一天的日期
LocalDate firstDayOfLastYearMonth = LocalDate.of(lastYear, currentMonth, 1);
// 格式化日期为 "yyyy-MM-dd"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return firstDayOfLastYearMonth.format(formatter);
}
/**
* 获取当前年月最后一天的日期
* @return 当前年月最后一天的日期格式为 "yyyy-MM-dd"
*/
public static String getLastDayOfCurrentMonth() {
// 获取当前的年份和月份
YearMonth currentYearMonth = YearMonth.now();
// 获取该年月的最后一天
LocalDate lastDayOfMonth = currentYearMonth.atEndOfMonth();
// 格式化日期为 "yyyy-MM-dd"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return lastDayOfMonth.format(formatter);
}
/**
* 判断目标时间是否在优惠时间段内
* @param startStr 开始时间(HH:mm)
* @param endStr 结束时间(HH:mm)
* @param targetStr 目标时间(HH:mm:ss)
* @return 是否在优惠时段
*/
public static boolean isInDiscountPeriod(String startStr, String endStr, String targetStr) {
LocalTime start = LocalTime.parse(startStr);
LocalTime end = LocalTime.parse(endStr);
LocalTime target = LocalTime.parse(targetStr);
return isInDiscountPeriod(start, end, target);
}
/**
* 判断目标时间是否在优惠时间段内
* @param start 开始时间(HH:mm)
* @param end 结束时间(HH:mm)
* @param target 目标时间(HH:mm:ss)
* @return 是否在优惠时段
*/
public static boolean isInDiscountPeriod(LocalTime start, LocalTime end, LocalTime target) {
// 任意参数为空返回false
if (start == null || end == null || target == null) {
return false;
}
// 开始时间等于结束时间即判定为全天
if (start.equals(end)) {
return true;
}
if (start.isAfter(end)) {
// 跨天判断逻辑
return !target.isBefore(start) || target.isBefore(end);
} else {
// 普通时段判断逻辑
return !target.isBefore(start) && target.isBefore(end);
}
2024-06-19 09:00:06 +08:00
}
2025-03-19 15:58:15 +08:00
/**
* 获取当前时间的前半年日期
* @return
*/
public static String getHalfYearAgo(String nowStr) {
LocalDate now = LocalDate.parse(nowStr);
LocalDate halfYearAgo = now.minusMonths(6);
return halfYearAgo.toString();
}
2023-03-04 16:29:55 +08:00
}