这只是我在日常开发中自定义的时间工具类,其中的异常捕获读者们可以根据自己自定义的异常类来接收。
/**
* LocalDateTime 时间类型工具类
*
* @author feifei
*/
public class LocalDateTimeUtil {
public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final String TIME_PATTERN = "HH:mm:ss";
public static final String SPLIT_STR = " ~ ";
/**
* 将时间类型转换为字符串,转换格式自定义
*
* @param dateTime 时间
* @param pattern 转换格式
* @return
*/
public static String formatDateTime2Str(LocalDateTime dateTime, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return dateTimeFormatter.format(dateTime);
}
/**
* 将时间类型转换为年月日时分秒的字符串类型, 转换格式:yyyy-MM-dd HH:mm:ss
* ps: 2018-01-01 12:12:12
*
* @param dateTime 时间
* @return
*/
public static String formatDateTime2Str(LocalDateTime dateTime) {
return formatDateTime2Str(dateTime, DATE_TIME_PATTERN);
}
/**
* 将时间类型转换为年月日的字符串类型,转换格式为:yyyy-MM-dd
* ps: 2018-01-01
*
* @param dateTime 时间
* @return
*/
public static String formatDate2Str(LocalDateTime dateTime) {
return formatDateTime2Str(dateTime, DATE_PATTERN);
}
/**
* 将时间类型转换为时分秒的字符串格式,转换格式为:HH:mm:ss
*
* @param dateTime 时间
* @return
*/
public static String formatTime2Str(LocalDateTime dateTime) {
return formatDateTime2Str(dateTime, TIME_PATTERN);
}
// /**
// * 将字符串类型转换为时间类型, 其他转换格式会出现错误,暂不做处理
// * @param dateTime 时间字符串
// * @param pattern 转换格式
// * @return
// */
// @Deprecated
// public static LocalDateTime parseStr2LocalDateTime(String dateTime, String pattern) {
// return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(pattern));
// }
/**
* 将字符串类型转换为时间类型, 仅支持 {@code yyyy-MM-dd HH:mm:ss} 格式类型
*
* @param dateTime 时间字符串
* @return
*/
public static LocalDateTime parseStr2LocalDateTime(String dateTime) throws RuntimeException {
// DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// .appendPattern("yyyy-MM-dd[['T'HH][:mm][:ss]]")
// .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
// .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
// .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
// .parseDefaulting(ChronoField.MILLI_OF_SECOND, 0)
// .toFormatter();
// return LocalDateTime.parse(dateTime, formatter);
Asserts.notEmpty(dateTime, "时间字符串不可为空");
try {
// yyyy-MM-dd HH:mm:ss => 长度为19
if (dateTime.length() < 19) {
Date date = DateUtils.parseDate(dateTime, DATE_PATTERN);
return date2LocalDateTime(date);
}
return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(DATE_TIME_PATTERN));
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("时间转换失败");
}
}
/**
* 将 {@link Date} 转换为 {@link LocalDateTime} 类型,时区默认为东8区(北京时间)
*/
public static LocalDateTime date2LocalDateTime(Date date) {
return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
}
/**
* 将 {@link LocalDateTime} 转换为 {@link Date} 类型,时区默认为东8区(北京时间)
*/
public static Date localDateTime2Date(LocalDateTime localDateTime) {
return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
}
/**
* 对时间区间进行分割
* @return
*/
public static String[] substringDate(String dateInterval) {
if (StringUtils.isNotBlank(dateInterval)) {
return dateInterval.trim().split(SPLIT_STR);
}
return new String[2];
}
/**
* 获取一段时间的每一天的年月日集合
* @param start 开始时间
* @param end 结束时间
* @return
*/
public static List getDateInterval(String start, String end) {
LocalDate startDate = LocalDate.parse(start);
LocalDate endDate = LocalDate.parse(end);
if (startDate.isEqual(endDate)) {
ArrayList result = new ArrayList<>(1);
result.add(startDate.toString());
return result;
}
// 获取天数区间
long distance = getDayInterval(startDate, endDate);
int capacity = (int) (distance + 1);
// 获取时间区间,是为了创建ArrayList集合时,直接指定容量大小,
// 防止出现天数间距过大, 造成ArrayList集合进行多次扩容,影响性能
List list = new ArrayList<>(capacity);
Stream.iterate(startDate, d -> d.plusDays(1)).limit(distance + 1).forEach(f -> list.add(f.toString()));
return list;
}
/**
* 获取年月日
* @return
*/
public static String getYYD(Date dateTime) {
if (Objects.isNull(dateTime)) {
throw new SuperCodeExtException("时间不可为空");
}
return DateFormatUtils.format(dateTime, "yyyy-MM-dd");
}
/**
* 计算日期{@code startDate}与{@code endDate}的间隔天数
* @return
*/
public static long getDayInterval(LocalDate startDate, LocalDate endDate) {
return ChronoUnit.DAYS.between(startDate, endDate);
}
}