一. 前言:
小熙最近有些忙,刚想起来账号密码就马上登录了。刚用到自己写得时间工具类(JDK8新特性),就分享一波吧,凑一下活跃度,哈哈。
二. 代码:
package com.chengxi.datalom.utils;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.chengxi.datalom.utils.common.CommonConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* 程熙cjp:https://blog.csdn.net/weixin_41133233
* <p>
* 格式化时间工具类(Java 8新特性)
* 建议结合自己项目本身的异常捕获实现(有些方法的容错粒度请结合本身项目添加)
* 和日志相关实现等优化成适合自己项目的工具类
*
* @author chengxi
* @date 2020/1/5
*/
@Slf4j
public class LocalDateUtils {
/**
* 完整时间(默认时间格式) yyyy-MM-dd HH:mm:ss
*/
public static final String defaultTimeFormat = "yyyy-MM-dd HH:mm:ss";
/**
* 年月日(无下划线) yyyyMMdd
*/
public static final String noUnderlineYMD = "yyyyMMdd";
/**
* 年月日(默认格式) yyyy-MM-dd
*/
public static final String defaultYMD = "yyyy-MM-dd";
/**
* 年月日时分秒(无下划线) yyyyMMddHHmmss
*/
public static final String noUnderlineYMDHMS = "yyyyMMddHHmmss";
/**
* 默认时分秒
*/
public static final String defaultHMS = "HH:mm:ss";
/**
* 默认时分秒
*/
public static final String defaultHM = "HH:mm";
/**
* 根据自定义格式返回,被格式的时间
*
* @param time
* @param formatterTime
* @return
*/
public static LocalDateTime getLocalDateTime(String time, String formatterTime) {
return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(formatterTime));
}
/**
* 只输入需要被格式化的时间,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
*
* @param time
* @return
*/
public static LocalDateTime getLocalDateTime(String time) {
return StringUtils.isBlank(time) ? null:getLocalDateTime(time, defaultTimeFormat);
}
/**
* 根据输入的时间格式,返回当前时间
*
* @param formatterTime
* @return
*/
public static String getNowTime(String formatterTime) {
if (StringUtils.isBlank(formatterTime)) {
formatterTime = defaultTimeFormat;
}
return DateTimeFormatter.ofPattern(formatterTime).format(LocalDateTime.now());
}
/**
* 返回当前时间,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
*
* @return
*/
public static String getNowTime() {
return DateTimeFormatter.ofPattern(defaultTimeFormat).format(LocalDateTime.now());
}
/**
* 根据时间格式返回时间字符串
*
* @param localDateTime
* @param formatterTime
* @return
*/
public static String getTimeString(LocalDateTime localDateTime, String formatterTime) {
return DateTimeFormatter.ofPattern(formatterTime).format(localDateTime);
}
/**
* 返回完整时间(默认时间格式)字符串
*
* @param localDateTime
* @return
*/
public static String getTimeString(LocalDateTime localDateTime) {
return DateTimeFormatter.ofPattern(defaultTimeFormat).format(localDateTime);
}
/**
* 返回完整时间(默认时间格式)字符串
*
* @param date
* @return
*/
public static String getTimeString(Date date) {
return getTimeString(getLocalDateTime(date));
}
/**
* 将日期转换为字符串(默认格式)
*
* @param date
* @return
*/
public static String getDateString(Date date) {
return DateTimeFormatter.ofPattern(defaultTimeFormat).format(getLocalDateTime(date));
}
/**
* 转换为LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime getLocalDateTime(Date date) {
//An instantaneous point on the time-line.(时间线上的一个瞬时点。)
Instant instant = date.toInstant();
//A time-zone ID, such as {@code Europe/Paris}.(时区)
ZoneId zoneId = ZoneId.systemDefault();
return instant.atZone(zoneId).toLocalDateTime();
}
/**
* 获取毫秒值,默认东八区
*
* @param localDateTime
* @param offset
* @return
*/
public static Long getTime(LocalDateTime localDateTime, String offset) {
return localDateTime.toInstant(ZoneOffset.of(StringUtils.isBlank(offset) ? "+8":offset)).toEpochMilli();
}
/**
* 获取毫秒值,默认东八区
*
* @param localDateTime
* @return
*/
public static Long getTime(LocalDateTime localDateTime) {
return getTime(localDateTime, null);
}
/**
* 比较当前时间是否是输入时间之后,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
*
* @param enterTime
* @return
*/
public static Boolean nowCompareEnterTimeIsAfter(String enterTime) {
return LocalDateTime.now().isAfter(LocalDateTime.parse(enterTime, DateTimeFormatter.ofPattern(defaultTimeFormat)));
}
/**
* 比较当前时间是否是输入时间之后
*
* @param enterTime
* @return
*/
public static Boolean nowCompareEnterTimeIsAfter(LocalDateTime enterTime) {
return LocalDateTime.now().isAfter(enterTime);
}
/**
* 比较当前时间是否是输入时间之前,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
*
* @param enterTime
* @return
*/
public static Boolean nowCompareEnterTimeIsBefore(String enterTime) {
return LocalDateTime.now().isBefore(LocalDateTime.parse(enterTime, DateTimeFormatter.ofPattern(defaultTimeFormat)));
}
/**
* 比较当前时间是否是输入时间之前
*
* @param enterTime
* @return
*/
public static Boolean nowCompareEnterTimeIsBefore(LocalDateTime enterTime) {
return LocalDateTime.now().isBefore(enterTime);
}
/**
* 判断当前时间是否是在,输入的开始时间和结束时间之中
*
* @param startEnterTime
* @param endEnterTime
* @return
*/
public static Boolean nowIsInEnterTime(LocalDateTime startEnterTime, LocalDateTime endEnterTime) {
return LocalDateTime.now().isAfter(startEnterTime) && LocalDateTime.now().isBefore(endEnterTime);
}
/**
* 判断输入第一个时间是否在第二个输入时间之前
*
* @param enterTimeOne
* @param enterTimeTwo
* @return
*/
public static Boolean enterTimeOneIsEnterTimeTwoBefore(String enterTimeOne, String enterTimeTwo) {
return getLocalDateTime(enterTimeOne).isBefore(getLocalDateTime(enterTimeTwo));
}
/**
* 判断输入第一个时间是否在第二个输入时间之后
*
* @param enterTimeOne
* @param enterTimeTwo
* @return
*/
public static Boolean enterTimeOneIsEnterTimeTwoAfter(String enterTimeOne, String enterTimeTwo) {
return getLocalDateTime(enterTimeOne).isAfter(getLocalDateTime(enterTimeTwo));
}
/**
* 判断两组时间没有交叉
*
* @param oneGroupStartTime
* @param oneGroupEndTime
* @param twoGroupStartTime
* @param twoGroupEndTime
* @return
*/
public static Boolean twoGroupsOfTimeIsNotCross(String oneGroupStartTime, String oneGroupEndTime, String twoGroupStartTime, String twoGroupEndTime) {
return (enterTimeOneIsEnterTimeTwoBefore(oneGroupStartTime, twoGroupStartTime) &&
enterTimeOneIsEnterTimeTwoBefore(oneGroupEndTime, twoGroupStartTime)) ||
(enterTimeOneIsEnterTimeTwoAfter(oneGroupStartTime, twoGroupEndTime) &&
enterTimeOneIsEnterTimeTwoAfter(oneGroupEndTime, twoGroupEndTime));
}
/**
* 判断两组时间没有交叉
*
* @param oneGroupStartTime
* @param oneGroupEndTime
* @param twoGroupStartTime
* @param twoGroupEndTime
* @return
*/
public static Boolean twoGroupsOfTimeIsNotCross(LocalDateTime oneGroupStartTime, LocalDateTime oneGroupEndTime, LocalDateTime twoGroupStartTime, LocalDateTime twoGroupEndTime) {
return (oneGroupStartTime.isBefore(twoGroupStartTime) && oneGroupEndTime.isBefore(twoGroupStartTime)) ||
(oneGroupStartTime.isAfter(twoGroupEndTime) && oneGroupEndTime.isAfter(twoGroupEndTime));
}
/**
* 计算时间的小时差值
*
* @param startTime
* @param endTime
* @return
*/
public static Double calcStartTimeAndEndTimeHourDifference(String startTime, String endTime, String dateTimeFormat) {
DateTime startDateTime = DateUtil.parse(startTime, dateTimeFormat);
DateTime endDateTime = DateUtil.parse(endTime, dateTimeFormat);
long minuteBetween = DateUtil.between(startDateTime, endDateTime, DateUnit.MINUTE);
return Double.valueOf(String.valueOf(minuteBetween)) / 60;
}
/**
* 将Excel中获取的时间小数转为时间(目前是时分)
*
* @param dateTimeNumber
* @return
*/
@Deprecated
public static String getDateTimeByExcelImport(String dateTimeNumber) {
double timeNumber = Double.valueOf(dateTimeNumber) * 24;
double minuterNumber = MathUtil.formatOnlyTwoDecimalDouble(timeNumber) * 60;
return MathUtil.formatNonReservedDecimalString(timeNumber) + ":" + minuterNumber;
}
/**
* 获取DateTime
*
* @param dateString
* @param formatString
* @return
*/
public static DateTime getDateTime(String dateString, String formatString) {
return DateTime.of(dateString, formatString);
}
/**
* 获取DateTime
*
* @param dateString
* @return
*/
public static DateTime getDateTime(String dateString) {
return getDateTime(dateString, defaultHMS);
}
/**
* 第一个时间是否在第二个时间之后
*
* @param enterTimeOne
* @param enterTimeTwo
* @return
*/
public static Boolean enterDateTimeOneIsEnterDateTimeTwoAfter(String enterTimeOne, String enterTimeTwo) {
return enterDateTimeOneIsEnterDateTimeTwoAfter(getDateTime(enterTimeOne), getDateTime(enterTimeTwo));
}
/**
* 第一个时间是否在第二个时间之后
*
* @param enterTimeOne
* @param enterTimeTwo
* @return
*/
public static Boolean enterDateTimeOneIsEnterDateTimeTwoAfter(DateTime enterTimeOne, DateTime enterTimeTwo) {
return enterTimeOne.isAfter(enterTimeTwo);
}
/**
* 时间是否在[0-12]之间
*
* @param dateString
* @return
*/
public static Boolean judgeTimeIsZeroToTwelve(String dateString) {
return getDateTime(dateString).isIn(getDateTime("00:00:00"), getDateTime("12:00:00"));
}
/**
* 校验两个时间是否都在[0-12]之间,或者都不在
*
* @param dateOneString
* @param dateTwoString
* @return
*/
public static Boolean judgeTimeIsAllZeroToTwelveOrNoAllZeroToTwelve(String dateOneString, String dateTwoString) {
return (judgeTimeIsZeroToTwelve(dateOneString) && judgeTimeIsZeroToTwelve(dateTwoString)) || (!judgeTimeIsZeroToTwelve(dateOneString) && !judgeTimeIsZeroToTwelve(dateTwoString));
}
/**
* LocalDateTime转毫秒时间戳
*
* @param localDateTime
* @return
*/
public static long getTimestamp(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return instant.toEpochMilli();
}
/**
* 默认东八区
*
* @param timestamp
* @return
*/
public static LocalDateTime getLocalDateTime(Long timestamp) {
return LocalDateTime.ofEpochSecond(timestamp, 0, ZoneOffset.ofHours(8));
}
/**
* 将秒转为时间字符串
*
* @param timestamp
* @param timeFormat
* @return
*/
public static String secondToLocalDateTimeString(Long timestamp, String timeFormat) {
return getTimeString(getLocalDateTime(timestamp * 1000), timeFormat);
}
/**
* 将秒转为时间字符串(使用默认时间格式)
*
* @param timestamp
* @return
*/
public static String secondToLocalDateTimeString(Long timestamp) {
return timestamp == null ? null : getTimeString(getLocalDateTime(timestamp / 1000), defaultTimeFormat);
}
/**
* 获取秒级时间值
*
* @param time
* @return
*/
public static Long getTimeToSecond(String time) {
return StringUtils.isBlank(time) ? null:getTimeToMillisecond(time) / 1000;
}
/**
* 获取毫秒级时间值
*
* @param time
* @return
*/
public static long getTimeToMillisecond(String time) {
return getTime(time, defaultTimeFormat);
}
/**
* 字符串时间转LocalDateTime
*
* @param time
* @param format
* @return
*/
public static LocalDateTime parse(String time, String format) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
return LocalDateTime.parse(time, df);
}
/**
* 根据对应格式获取对应时间值
*
* @param time
* @param format
* @return
*/
public static long getTime(String time, String format) {
LocalDateTime dateTime = null;
try {
dateTime = parse(time, format);
} catch (Exception e) {
e.printStackTrace();
log.error("时间格式化错误, 参数为:{}, 格式为:{}, 错误信息为:", time, format, e.getMessage());
}
return getTimestamp(dateTime);
}
/**
* 获取固定间隔时刻集合
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param interval 时间间隔(单位:分钟)
* @param timeFormat 时间格式
* @return
*/
public static List<Map<String, String>> getIntervalTimeList(String startTime, String endTime, long interval, String timeFormat) {
LocalDateTime startLocalDateTime = getLocalDateTime(startTime, timeFormat);
LocalDateTime endLocalDateTime = getLocalDateTime(endTime, timeFormat);
List<Map<String, String>> intervalTimeList = new ArrayList<>();
while (startLocalDateTime.isBefore(endLocalDateTime)) {
Map<String, String> intervalTimeMap = new LinkedHashMap<>(2);
// startTime
intervalTimeMap.put(CommonConstants.START_TIME, getTimeString(startLocalDateTime, timeFormat));
LocalDateTime tempLocalDateTime = startLocalDateTime.plusMinutes(interval);
// endTime
intervalTimeMap.put(CommonConstants.END_TIME, getTimeString(tempLocalDateTime.isBefore(endLocalDateTime) ? tempLocalDateTime:endLocalDateTime, timeFormat));
intervalTimeList.add(intervalTimeMap);
startLocalDateTime = tempLocalDateTime;
}
return intervalTimeList;
}
/**
* 获取固定间隔时刻集合
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param interval 时间间隔(单位:分钟) 其他单位待优化
* @return
*/
public static List<Map<String, String>> getIntervalTimeList(String startTime, String endTime, long interval) {
return getIntervalTimeList(startTime, endTime, interval, defaultTimeFormat);
}
/**
* 获取时间间隔
*
* @param startTime
* @param endTime
* @return
*/
public static Long getMinuteInterval(LocalDateTime startTime, LocalDateTime endTime) {
Duration duration = Duration.between(startTime, endTime);
return duration.toMinutes();
}
public static void main(String[] args) {
List<Map<String, String>> intervalTimeList = getIntervalTimeList("2021-04-04 12:00:00", "2021-04-05 20:30:00", 60, defaultTimeFormat);
intervalTimeList.forEach(System.out::println);
}
}
三. 后语:
此工具类,后期有时间会继续拓展维护。