Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解
一、Java8之前日期類所存在的問題
在Java8之前通常會使用Date結合 SimpleDateFormat、Calender來處理時間和日期的相關需求。
但是這些API也存在明顯的缺點:
可讀性差、易用性差、使用起來冗余繁瑣
java.util.Date是非線程安全的java.util.Date存在千年蟲問題、并且不支持國際化和時區(qū)、故大部分方法被聲明為過時、不建議再使用java.util和java.sql兩包中都有Date類,設計上并不合理
而java8在java.time包下重新實現了日期相關類。
每個類功能明確清晰、類之間協(xié)作簡單、API 定義清晰、功能強大無需借助外部工具類,并且線程安全。
二、Java8新增日期類
Java8新增的日期類主要有三個:
LocalDate:表示日期(年月日)LocalTime:表示時間(時分秒)LocalDateTime:表示時間+ 日期 (年月日時分秒),是java8最常用的日期類
這些類使用了final來修飾,使得這些類是不可變的,一旦實例化,值就固定了,有點類似于String類。
因此它們都是線程安全的。
2.1 LocalDate
2.1.1 常用API
| 方法 | 描述 |
|---|---|
| static LocalDate now() | 獲取默認時區(qū)的當前日期對象 |
| static LocalDate now(Clock clock) | 從指定時鐘獲取當前日期對象 |
| static LocalDate now(ZoneId zone) | 獲取指定時區(qū)的當前日期對象 |
| of | 根據指定年月日創(chuàng)建LocalDate對象 |
| getYear | 獲得年份 |
| getMonthValue | 獲得月份(1-12) |
| getMonth | 獲得月份枚舉值 |
| getDayOfMonth | 獲得月份中的第幾天(1-31) |
| getDayOfWeek | 獲得星期幾 |
| getDayOfYear | 獲得年份中的第幾天(1-366) |
| lengthOfYear | 獲得當年總天數 |
| lengthOfMonth | 獲得當月總天數 |
| toEpochDay | 與時間紀元(1970年1月1日)相差的天數 |
| plusDays | 加天 |
| plusWeeks | 加周 |
| plusMonths | 加月 |
| plusYears | 加年 |
| minusDays | 減年 |
| minusWeeks | 減周 |
| minusMonths | 減月 |
| minusYears | 減年 |
| withYear | 替換年份 |
| withMonth | 替換月份 |
| withDayOfMonth | 替換月份中的第幾天(1-31) |
| withDayOfYear | 替換年份中的第幾天(1-366) |
| isBefore | 是否日期在之前 |
| isAfter | 是否日期在之后 |
| isEqual | 是否是當前日期 |
| isleapYear | 是否是閏年 |
2.1.2 使用示例
1)創(chuàng)建方法
LocalDate now1 = LocalDate.now(); // 當前日期
LocalDate now2 = LocalDate.now(ZoneId.of("Asia/Shanghai")); // 當前日期 (指定時區(qū))
LocalDate now3 = LocalDate.now(Clock.systemDefaultZone()); // 當前日期 (指定時鐘)
LocalDate localDate = LocalDate.of(2023, 1, 1); // 指定日期 2023-01-01
2)獲取方法
LocalDate now = LocalDate.now(); int year = now.getYear(); // 獲取年份 int month = now.getMonthValue(); // 獲取月份(1-12) Month monthEnum = now.getMonth(); // 獲取月份的枚舉值 int dayOfMonth = now.getDayOfMonth(); // 獲取月份中的第幾天(1-31) int dayOfYear = now.getDayOfYear(); // 獲取一年中的第幾天(1-366) DayOfWeek dayOfWeek = now.getDayOfWeek(); // 獲取現在是星期幾 int dayOfYear = now.getDayOfYear(); // 獲取一年中的第幾天(1-366) int lengthOfYear = now.lengthOfYear(); // 獲得當年總天數 int lengthOfMonth = now.lengthOfMonth(); // 獲得當月總天數 long epochDay = now.toEpochDay(); // 與時間紀元(1970年1月1日)相差的天數
3)運算方法
LocalDate now = LocalDate.now(); LocalDate localDate1 = now.plusDays(1); // 給當前時間加一天 LocalDate localDate2 = now.plusDays(1); // 給當前時間加一周 LocalDate localDate3 = now.plusMonths(1); // 給當前時間加一月 LocalDate localDate4 = now.plusYears(1); // 給當前時間加一年 LocalDate localDate5 = now.minusDays(1); // 給當前時間減一天 LocalDate localDate6 = now.minusWeeks(1); // 給當前時間減一周 LocalDate localDate7 = now.minusMonths(1); // 給當前時間減一月 LocalDate localDate8 = now.minusYears(1); // 給當前時間減一年
4)修改方法
LocalDate now = LocalDate.now(); LocalDate localDate1 = now.withYear(2020); // 修改日期對象年份為2020 LocalDate localDate2 = now.withMonth(1); // 修改日期對象月份為1 LocalDate localDate3 = now.withDayOfMonth(1); // 修改日期對象的日期(一月中的第幾天) LocalDate localDate4 = now.withDayOfYear(1); // 修改日期對象的日期(一年中的第幾天)
5)比較方法
LocalDate now = LocalDate.now();
LocalDate localDate = LocalDate.of(2023, 1, 1)
boolean isBefore = localDate.isBefore(now); // localDate是否在當天之前
boolean isAfter = localDate.isAfter(now); // localDate是否在當天之后
boolean isEqual = localDate.isEqual(now); // localDate是否在當天
boolean isLeapYear = localDate.isLeapYear(); // localDate是否是閏年
6)LocalDate 與 Date之間的轉換
/**
* LocalDate轉Date
* @param localDate
* @return
*/
public static Date toDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/**
* Date轉LocalDate
* @param Date
* @return
*/
public static Date toLocalDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
7)LocalDate 與 String之間的轉換
/**
* String轉LocalDate
* @param dateStr 日期的字符串
* @param pattern 格式示例: yyyy-MM-dd
* @return
*/
public static LocalDate toLocalDate(String dateStr, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDate.parse(dateStr, formatter);
}
/**
* LocalDate轉String
* @param localDate localDate對象
* @param pattern 格式示例: yyyy-MM-dd
* @return
*/
public static String LocalDatetoStr(LocalDate localDate, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return localDate.format(formatter);
}
2.2 LocalTime
2.2.1 常用API
| 方法 | 描述 |
|---|---|
| static LocalTime now() | 獲取默認時區(qū)的當前時間 |
| static LocalTime now(ZoneId zone) | 獲取指定時區(qū)的當前時間 |
| static LocalTime now(Clock clock) | 從指定時鐘獲取當前時間 |
| of | 根據指定的時、分、秒獲取LocalTime 實例 |
| getHour | 獲取小時 |
| getMinute | 獲取分鐘 |
| getSecond | 獲取秒 |
| getNano | 獲取納秒 |
| plusHours | 增加小時數 |
| plusMinutes | 增加分鐘數 |
| plusSeconds | 增加秒數 |
| plusNanos | 增加納秒數 |
| minusHours | 減少小時數 |
| minusMinutes | 減少分鐘數 |
| minusSeconds | 減少秒數 |
| minusNanos | 減少納秒數 |
| withHour | 替換小時 |
| withMinute | 替換分鐘 |
| withSecond | 替換秒鐘 |
| withNano | 替換納秒 |
| compareTo | 時間與另一個時間比較 |
| isAfter | 檢查時間是否在指定時間之后 |
| isBefore | 檢查時間是否在指定時間之前 |
2.2.2 使用示例
1)創(chuàng)建方法
LocalTime now1 = LocalTime.now(); // 當前時間
LocalTime now2 = LocalTime.now(ZoneId.of("Asia/Shanghai")); // 當前時間 (指定時區(qū))
LocalTime now3 = LocalTime.now(Clock.systemDefaultZone()); // 當前時間 (指定時鐘)
LocalTime localTime = LocalTime.of(9, 9, 9); // 指定時間 09:09:09
2)獲取方法
LocalTime now = LocalTime.now(); int hour = now.getHour(); // 獲取小時 int minute = now.getMinute(); // 獲取小時 int second = now.getSecond(); // 獲取秒 int nano = now.getNano(); // 獲取納秒
3)運算方法
LocalTime now = LocalTime.now(); LocalTime localTime1 = now.plusHours(1); // 給當前時間加一小時 LocalTime localTime2 = now.plusMinutes(1); // 給當前時間加一分鐘 LocalTime localTime3 = now.plusSeconds(1); // 給當前時間加一秒 LocalTime localTime4 = now.plusNanos(1); // 給當前時間加一納秒 LocalTime localTime1 = now.minusHours(1); // 給當前時間減一小時 LocalTime localTime2 = now.minusMinutes(1); // 給當前時間減一分鐘 LocalTime localTime3 = now.minusSeconds(1); // 給當前時間減一秒 LocalTime localTime4 = now.minusNanos(1); // 給當前時間減一納秒
4)修改方法
LocalTime now = LocalTime.now(); LocalDate localTime1 = now.withHour(1); // 修改時間對象小時為1 LocalDate localTime2 = now.withMinute(1); // 修改時間對象分鐘為1 LocalDate localTime3 = now.withSecond(1); // 修改時間對象秒鐘為1 LocalDate localTime4 = now.withNano(1); // 修改時間對象納秒為1
5)比較方法
LocalTime now = LocalTime.now(); LocalTime localTime = LocalTime.of(9, 9, 9); int compare = localTime.compareTo(now); // localTime和當前時間比較--0(相等)正數(大)負數(小) boolean after = localTime.isAfter(now); // localTime是否在當前時間之后 boolean before = localTime.isBefore(now); // localTime是否在當前時間之前
6)LocalTime 與 String之間的轉換
/**
* String轉LocalTime
* @param timeStr 日期的字符串
* @param pattern 格式示例: HH:mm:ss
* @return
*/
public static LocalTime toLocalTime(String timeStr, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalTime.parse(timeStr, formatter);
}
/**
* LocalTime轉String
* @param localTime localTime對象
* @param pattern 格式示例: HH:mm:ss
* @return
*/
public static LocalTime localTimeToStr(LocalTime localTime, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return localTime.format(formatter);
}
LocalTime是無法轉換為Date的,因為它值包含了時間部分,而沒有日期部分
2.3 LocalDateTime
2.2.1 常用API
| 方法 | 描述 |
|---|---|
| static LocalDateTime now() | 獲取默認時區(qū)的當前日期時間 |
| static LocalDateTime now(Clock clock) | 從指定時鐘獲取當前日期時間 |
| static LocalDateTime now(ZoneId zone) | 獲取指定時區(qū)的當前日期時間 |
| static LocalDateTime of(LocalDate date, LocalTime time) | 根據日期和時間對象獲取LocalDateTime 對象 |
| static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) | 根據指定的年、月、日、時、分、秒獲取LocalDateTime 實例 |
| getYear | 獲取年份 |
| getMonth | 使用月份枚舉類獲取月份 |
| getDayOfMonth | 獲取日期在該月是第幾天 |
| getDayOfWeek | 獲取日期是星期幾 |
| getDayOfYear | 獲取日期在該年是第幾天 |
| getHour | 獲取小時 |
| getMinute | 獲取分鐘 |
| getSecond | 獲取秒 |
| getNano | 獲取納秒 |
| plusYears | 增加年 |
| plusMonths | 增加月 |
| plusWeeks | 增加周 |
| plusDays | 增加天 |
| plusHours | 增加小時 |
| plusMinutes | 增加分 |
| plusSeconds | 增加秒 |
| plusNanos | 增加納秒 |
| minusYears | 減少年 |
| minusMonths | 減少月 |
| meminusWeeks | 減少周 |
| minusDays | 減少天 |
| minusHours | 減少小時 |
| minusMinutes | 減少分 |
| minusSeconds | 減少秒 |
| minusNanos | 減少納秒 |
| withYear | 替換年份 |
| withMonth | 替換月份 |
| withDayOfMonth | 替換月份中的第幾天(1-31) |
| withDayOfYear | 替換年份中的第幾天(1-366) |
| withHour | 替換小時 |
| withMinute | 替換分鐘 |
| withSecond | 替換秒鐘 |
| withNano | 替換納秒 |
| isEqual | 判斷日期時間是否相等 |
| isBefore | 檢查是否在指定日期時間之前 |
| isAfter | 檢查是否在指定日期時間之后 |
2.2.2 使用示例
1)創(chuàng)建方法
// 1.當前日期
LocalDateTime now1 = LocalDateTime.now();
// 2.當前日期 (指定時區(qū))
LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
// 3.當前日期 (指定時鐘)
LocalDateTime now3 = LocalDateTime.now(Clock.systemDefaultZone());
// 4.指定日期 2023-01-01 01:01:00
LocalDateTime localDateTime1 = LocalDateTime.of(2023, 1, 1, 1, 1);
// 4.使用LocalDate和LocalTime對象創(chuàng)建LocalDateTime對象
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
2)獲取方法
LocalDateTime now = LocalDateTime.now(); int year = now.getYear(); // 獲取年份 Month month = now.getMonth(); // 使用月份枚舉值 int dayOfMonth = now.getDayOfMonth(); // 獲取日期在該月是第幾天 DayOfWeek dayOfWeek = now.getDayOfWeek(); // 獲取日期是星期幾 int dayOfYear = now.getDayOfYear(); // 獲取日期在該年是第幾天 int hour = now.getHour(); // 獲取小時 int minute = now.getMinute(); // 獲取分鐘 int second = now.getSecond(); // 獲取秒鐘 int nano = now.getNano(); // 獲取納秒
3)運算方法
LocalDateTime now = LocalDateTime.now(); LocalDateTime localDateTime1 = now.plusDays(1); // 給當前時間加一天 LocalDateTime localDateTime2 = now.plusDays(1); // 給當前時間加一周 LocalDateTime localDateTime3 = now.plusMonths(1); // 給當前時間加一月 LocalDateTime localDateTime4 = now.plusYears(1); // 給當前時間加一年 LocalDateTime localDateTime5 = now.plusHours(1); // 給當前時間加一小時 LocalDateTime localDateTime6 = now.plusMinutes(1); // 給當前時間加一分鐘 LocalDateTime localDateTime7 = now.plusSeconds(1); // 給當前時間加一秒 LocalDateTime localDateTime8 = now.plusNanos(1); // 給當前時間加一納秒 LocalDateTime localDateTime9 = now.minusDays(1); // 給當前時間減一天 LocalDateTime localDateTime10 = now.minusWeeks(1); // 給當前時間減一周 LocalDateTime localDateTime11 = now.minusMonths(1); // 給當前時間減一月 LocalDateTime localDateTime12 = now.minusYears(1); // 給當前時間減一年 LocalDateTime localDateTime13 = now.minusHours(1); // 給當前時間減一小時 LocalDateTime localDateTime14 = now.minusMinutes(1); // 給當前時間減一分鐘 LocalDateTime localDateTime15 = now.minusSeconds(1); // 給當前時間減一秒 LocalDateTime localDateTime16 = now.minusNanos(1); // 給當前時間減一納秒
4)修改方法
LocalDateTime now = LocalDateTime.now(); LocalDateTime localDate1 = now.withYear(2020); // 修改日期對象年份為2020 LocalDateTime localDate2 = now.withMonth(1); // 修改日期對象月份為1 LocalDateTime localDate3 = now.withDayOfMonth(1); // 修改日期對象的日期(一月中的第幾天) LocalDateTime localDate4 = now.withDayOfYear(1); // 修改日期對象的日期(一年中的第幾天) LocalDateTime localTime1 = now.withHour(1); // 修改時間對象小時為1 LocalDateTime localTime2 = now.withMinute(1); // 修改時間對象分鐘為1 LocalDateTime localTime3 = now.withSecond(1); // 修改時間對象秒鐘為1 LocalDateTime localTime4 = now.withNano(1); // 修改時間對象納秒為1
5)比較方法
LocalDateTime now = LocalDateTime.now(); LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 1, 1); boolean isBefore = localDateTime.isBefore(now); // localDateTime是否在當天之前 boolean isAfter = localDateTime.isAfter(now); // localDateTime是否在當天之后 boolean isEqual = localDateTime.isEqual(now); // localDateTime是否在當天
6)從LocalDateTime獲取LocalDate或者LocalTime
LocalDateTime localDateTime = LocalDateTime.now(); LocalDate localDate = localDateTime.toLocalDate(); // 從LocalDateTime獲取LocalDate對象 LocalTime localTime = localDateTime.toLocalTime(); // 從LocalDateTime獲取LocalTime對象
7)LocalDateTime與 String之間的轉換
/**
* String轉LocalDateTime
* @param dateTimeStr 日期的字符串
* @param pattern 格式示例: yyyy-MM-dd HH:mm:ss
* @return
*/
public static LocalDateTime toLocalDateTime(String dateTimeStr, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return LocalDateTime.parse(dateTimeStr, formatter);
}
/**
* LocalDateTime轉String
* @param localDateTime 日期時間對象
* @param pattern 格式示例: yyyy-MM-dd HH:mm:ss
* @return
*/
public static String LocalDateTimetoStr(LocalDateTime localDateTime, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return localDateTime.format(formatter);
}
8)LocalDateTime與 Date之間的轉換
/**
* Date轉LocalDateTime
* @param date jdk6 日期對象
* @param zoneId 時區(qū)id
* @return
*/
public static LocalDateTime toLocalDateTime(Date date, ZoneId zoneId) {
// toInstant():將Date對象轉換成為Instant(瞬時)對象
// ofInstant(): 將瞬時對象轉換成為LocalDateTime對象
Instant instant = date.toInstant();
if (zoneId == null) {
zoneId = ZoneId.systemDefault();
}
return LocalDateTime.ofInstant(instant, zoneId);
}
/**
* LocalDateTime轉Date
* @param localDateTime 日期時間對象
* @return
*/
public static Date LocalDateTimetoDate(LocalDateTime localDateTime, ZoneId zoneId) {
if (zoneId == null) {
zoneId = ZoneId.systemDefault();
}
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
Instant instant = zonedDateTime.toInstant();
return Date.from(instant);
}總結
到此這篇關于Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解的文章就介紹到這了,更多相關Java8日期類詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot?Shiro?anno不啟作用問題及解決
在Shiro配置中遇到靜態(tài)資源被攔截的問題,通過排除LinkedHashMap過濾次序和將過濾器手動創(chuàng)建而不是注冊到容器中解決,同時,確保JwtUtil類也不注冊到容器中,以避免請求報Not?authorized錯誤2026-03-03
SpringBoot 內置 CollectionUtil用法實戰(zhàn)指南
文章介紹了SpringBoot中自帶的CollectionUtil類,包括判空、轉換、合并、匹配和兜底功能,并通過實戰(zhàn)例子詳細展示了這些功能的應用場景和優(yōu)勢,感興趣的朋友跟隨小編一起看看吧2025-12-12
SpringBoot中分頁插件PageHelper的使用詳解
分頁查詢是為了高效展示大量數據,通過分頁將數據劃分為多個部分逐頁展示,原生方法需手動計算數據起始行,而使用PageHelper插件則簡化這一過程,本文給大家介紹SpringBoot中分頁插件PageHelper的使用,感興趣的朋友一起看看吧2024-09-09

