優點:
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(); } }