优点:
1.方便。
Date 只能是日期加时间的格式,而 LocalDate 、LocalTime、LocalDateTime
分别代表日期,时间,日期+时间,非常灵活。再就是后者在日期计算及格式化方面非常简单易用,而Date要繁琐很多。
2.线程安全。
传统时间类不支持多线程安全。
缺点<目前发现的坑>:
1.在比较日期相隔天数时,不要使用Period.between()方法,这个只是当月相隔天数。其实就是:a月b日 - c月d日 = (b-d)日
LocalDateTime:
他的toString()方法,不同其他类,中间有个T。可使用@JsonFormat注解,格式化需要的格式后转成json。前端展示就会显示对应的格式,当然,debug调试的时候,还是会显示T的。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Override public String toString() { return date.toString() + 'T' + time.toString(); }
注意:
比较时,会需要传接口Temporal作为参数,可用它的实现类,比如localDateTime即可。
如果比较相隔的时、分、毫秒时,需要将格式转成精确到小时以后<相隔的时、分、秒都可以只格式化到小时yyyy-MM-dd HH即可不报错>
附工具类代码:
public class DateUtil { public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss"); public static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); public static final DateTimeFormatter SHORT_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyMMdd"); public static final DateTimeFormatter SHORT_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmss"); public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); /** * 返回当前的日期 * @return */ public static LocalDate getCurrentLocalDate() { return LocalDate.now(); } /** * 返回当前时间 * @return */ public static LocalTime getCurrentLocalTime() { return LocalTime.now(); } /** * 返回当前日期时间 * @return */ public static LocalDateTime getCurrentLocalDateTime() { return LocalDateTime.now(); } /** * yyyyMMdd * * @return */ public static String getCurrentDateStr() { return LocalDate.now().format(DATE_FORMATTER); } /** * yyMMdd * * @return */ public static String getCurrentShortDateStr() { return LocalDate.now().format(SHORT_DATE_FORMATTER); } public static String getCurrentMonthStr() { return LocalDate.now().format(MONTH_FORMATTER); } /** * yyyyMMddHHmmss * @return */ public static String getCurrentDateTimeStr() { return LocalDateTime.now().format(DATETIME_FORMATTER); } /** * yyMMddHHmmss * @return */ public static String getCurrentShortDateTimeStr() { return LocalDateTime.now().format(SHORT_DATETIME_FORMATTER); } /** * HHmmss * @return */ public static String getCurrentTimeStr() { return LocalTime.now().format(TIME_FORMATTER); } public static String getCurrentDateStr(String pattern) { return LocalDate.now().format(DateTimeFormatter.ofPattern(pattern)); } public static String getCurrentDateTimeStr(String pattern) { return LocalDateTime.now().format(DateTimeFormatter.ofPattern(pattern)); } public static String getCurrentTimeStr(String pattern) { return LocalTime.now().format(DateTimeFormatter.ofPattern(pattern)); } public static LocalDate parseLocalDate(String dateStr, String pattern) { return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern)); } public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) { return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern)); } public static LocalTime parseLocalTime(String timeStr, String pattern) { return LocalTime.parse(timeStr, DateTimeFormatter.ofPattern(pattern)); } public static String formatLocalDate(LocalDate date, String pattern) { return date.format(DateTimeFormatter.ofPattern(pattern)); } public static String formatLocalDateTime(LocalDateTime datetime, String pattern) { return datetime.format(DateTimeFormatter.ofPattern(pattern)); } public static String formatLocalTime(LocalTime time, String pattern) { return time.format(DateTimeFormatter.ofPattern(pattern)); } public static LocalDate parseLocalDate(String dateStr) { return LocalDate.parse(dateStr, DATE_FORMATTER); } public static LocalDateTime parseLocalDateTime(String dateTimeStr) { return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER); } public static LocalTime parseLocalTime(String timeStr) { return LocalTime.parse(timeStr, TIME_FORMATTER); } public static String formatLocalDate(LocalDate date) { return date.format(DATE_FORMATTER); } public static String formatLocalDateTime(LocalDateTime datetime) { return datetime.format(DATETIME_FORMATTER); } public static String formatLocalTime(LocalTime time) { return time.format(TIME_FORMATTER); } /** * 日期相隔天数 * @param startDateInclusive * @param endDateExclusive * @return */ public static long periodDays(LocalDate startDateInclusive, LocalDate endDateExclusive) { return endDateExclusive.toEpochDay() - startDateInclusive.toEpochDay(); } /** * 日期相隔小时 * @param startInclusive * @param endExclusive * @return */ public static long durationHours(Temporal startInclusive, Temporal endExclusive) { return Duration.between(startInclusive, endExclusive).toHours(); } /** * 日期相隔分钟 * @param startInclusive * @param endExclusive * @return */ public static long durationMinutes(Temporal startInclusive, Temporal endExclusive) { return Duration.between(startInclusive, endExclusive).toMinutes(); } /** * 日期相隔毫秒数 * @param startInclusive * @param endExclusive * @return */ public static long durationMillis(Temporal startInclusive, Temporal endExclusive) { return Duration.between(startInclusive, endExclusive).toMillis(); } /** * 是否当天 * @param date * @return */ public static boolean isToday(LocalDate date) { return getCurrentLocalDate().equals(date); } /** * 获取此日期时间与默认时区<Asia/Shanghai>组合的时间毫秒数 * @param dateTime * @return */ public static Long toEpochMilli(LocalDateTime dateTime) { return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); } /** * 获取此日期时间与指定时区组合的时间毫秒数 * @param dateTime * @return */ public static Long toSelectEpochMilli(LocalDateTime dateTime, ZoneId zoneId) { return dateTime.atZone(zoneId).toInstant().toEpochMilli(); } }