Java开发中日期加减操作工具类
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* @author psq
* @date 2022-06-06 23:30
* @desc 线程安全的日期工具类
*/
public final class DateUtils {
/**
* 获取两个时间段之间的秒数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 秒数
*/
public static Long getDurationSecconds(String startTime, String endTime, String pattern) {
final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).getSeconds();
}
/**
* 获取两个时间段之间的秒数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 秒数
*/
public static Long getDurationSecconds(Date startTime, Date endTime, String pattern) {
final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).getSeconds();
}
/**
* 获取两个时间段之间的分钟数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 分钟数
*/
public static Long getDurationMinutes(String startTime, String endTime, String pattern) {
final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toMinutes();
}
/**
* 获取两个时间段之间的分钟数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 分钟数
*/
public static Long getDurationMinutes(Date startTime, Date endTime, String pattern) {
final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toMinutes();
}
/**
* 获取两个时间段之间的小时数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 小时
*/
public static Long getDurationHours(String startTime, String endTime, String pattern) {
final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toHours();
}
/**
* 获取两个时间段之间的小时数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 小时
*/
public static Long getDurationHours(Date startTime, Date endTime, String pattern) {
final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toHours();
}
/**
* 获取两个时间段之间的天数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 天数
*/
public static Long getDurationDays(String startTime, String endTime, String pattern) {
final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toDays();
}
/**
* 获取两个时间段之间的天数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param pattern 时间格式
* @return 天数
*/
public static Long getDurationDays(Date startTime, Date endTime, String pattern) {
final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
return Duration.between(start, end).toDays();
}
/**
* 当前时间加上目标时间返回这两个时间之间的秒数
*
* @param target 目标时间
* @param dateEnum 时间枚举
* @return 秒数
*/
public static Long currentDateSeccondsAddTarget(Long target, DateEnum dateEnum) throws IllegalAccessException {
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime targetDate = getLocalDateTime(target, dateEnum, now);
return Duration.between(now, targetDate).getSeconds();
}
/**
* 自定义时间加上目标时间后返回的时间
*
* @param target 目标时间
* @param dateEnum 时间枚举
* @param customerDate 自定义时间
* @param pattern 自定义时间模式
* @return 结果时间
* @throws IllegalAccessException
*/
public static String customizeDateAddTargetDate(String customerDate, String pattern, Long target, DateEnum dateEnum) throws IllegalAccessException {
final LocalDateTime customize = LocalDate.parse(customerDate, DateTimeFormatter.ofPattern(pattern)).atTime(LocalTime.now());
final LocalDateTime targetDate = getLocalDateTime(target, dateEnum, customize);
return targetDate.format(DateTimeFormatter.ofPattern(pattern));
}
/**
* 当前时间加上目标时间
*
* @param target 被加的时间 负数是 过去时间
* @param dateEnum 时间枚举
* @param pattern 返回的时间格式
* @return 增加后的时间
*/
public static String currentDateSeccondsAddTarget(Long target, DateEnum dateEnum, String pattern) throws IllegalAccessException {
return getLocalDateTime(target, dateEnum, LocalDateTime.now()).format(DateTimeFormatter.ofPattern(pattern));
}
private static LocalDateTime getLocalDateTime(Long target, DateEnum dateEnum, LocalDateTime now) throws IllegalAccessException {
LocalDateTime targetDate;
if (dateEnum.name().equals(DateEnum.SECONDS.name())) {
targetDate = now.plusSeconds(target);
} else if (dateEnum.name().equals(DateEnum.MINUTES.name())) {
targetDate = now.plusMinutes(target);
} else if (dateEnum.name().equals(DateEnum.HOUR.name())) {
targetDate = now.plusHours(target);
} else if (dateEnum.name().equals(DateEnum.DAY.name())) {
targetDate = now.plusDays(target);
} else if (dateEnum.name().equals(DateEnum.MONTH.name())) {
targetDate = now.plusMonths(target);
} else if (dateEnum.name().equals(DateEnum.WEEK.name())) {
targetDate = now.plusWeeks(target);
} else if (dateEnum.name().equals(DateEnum.YEAR.name())) {
targetDate = now.plusYears(target);
} else {
throw new IllegalAccessException("DateEnum object is Illegal");
}
return targetDate;
}
public static void main(String[] args) throws IllegalAccessException {
//当前时间减去5天
final String target = currentDateSeccondsAddTarget(Long.valueOf("-5"), DateEnum.DAY, "yyyy-MM-dd");
System.out.println(target);
//当前时间加上100天
final Long aLong = currentDateSeccondsAddTarget(100L, DateEnum.DAY);
System.out.println(aLong);
//指定时间、指定格式加上目标天数
final String targetDate = customizeDateAddTargetDate("2022-06-06", "yyyy-MM-dd", -3L, DateEnum.DAY);
System.out.println(targetDate);
}
}