Java 日期時(shí)間工具包–java.time的使用
從JDK8開始,Java 提供了新的日期時(shí)間處理方法用來(lái)代替舊的日期類(Date)。本章主要講它們的用法以及和舊日期類互轉(zhuǎn)。
日期和時(shí)間
Java 新的日期工具類在 java.time 包及子包中 ,日期類主要有 LocalDateTime、LocalDate、LocalTime ,這三個(gè)API類很相似,以下是常用API及說(shuō)明。
now()
靜態(tài)方法,獲取當(dāng)前時(shí)間日期。示例:LocalDateTime.now()
of()
靜態(tài)方法,指定日期時(shí)間生成LoalDateTime。示例:LocalDateTime.of(2020, 2, 9, 8, 0, 0)。如果是LocalDate,則只能指定年月日。如果是LocalTime則只能指定時(shí)分秒。
plus()
在當(dāng)前時(shí)間的基礎(chǔ)上增加時(shí)間并返回新的LocalDateTime,不會(huì)改變?cè)瓉?lái)時(shí)間。一般使用以下方法處理更簡(jiǎn)單:
| 方法 | 說(shuō)明 | 備注 |
|---|---|---|
| plusYears(1) | 增加1年 | LocalTime無(wú)此方法 |
| plusMonths(1) | 增加1個(gè)月 | LocalTime無(wú)此方法 |
| plusWeeks(1) | 增加1周 | LocalTime無(wú)此方法 |
| plusDays(1) | 增加1天 | LocalTime無(wú)此方法 |
| plusHours(1) | 增加1小時(shí) | LocalDate無(wú)此方法 |
| plusMinutes(1) | 增加1分鐘 | LocalDate無(wú)此方法 |
| plusSeconds(1) | 增加1秒 | LocalDate無(wú)此方法 |
minus()
在當(dāng)前時(shí)間的基礎(chǔ)上減去時(shí)間并返回新的LocalDateTime,不會(huì)改變?cè)瓉?lái)時(shí)間。一般使用以下方法處理更簡(jiǎn)單:
| 方法 | 說(shuō)明 | 備注 |
|---|---|---|
| minusYears(1) | 減少1年 | LocalTime無(wú)此方法 |
| minusMonths(1) | 減少1個(gè)月 | LocalTime無(wú)此方法 |
| minusWeeks(1) | 減少1周 | LocalTime無(wú)此方法 |
| minusDays(1) | 減少1天 | LocalTime無(wú)此方法 |
| minusHours(1) | 減少1小時(shí) | LocalDate無(wú)此方法 |
| minusMinutes(1) | 減少1分鐘 | LocalDate無(wú)此方法 |
| minusSeconds(1) | 減少1秒 | LocalDate無(wú)此方法 |
從上面幾個(gè)示例可以看到這三個(gè)類的區(qū)別,LocalDate不能處理時(shí)間,LocalTime不能處理日期,LocalDateTime是LocalDate和LocalTime的集合。
- 獲取從1970-01-01 00:00:00到當(dāng)前對(duì)象時(shí)間的毫秒數(shù):
LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
如果是LocalDate或LocaTime需要轉(zhuǎn)換成LocalDateTime對(duì)象,再獲取毫秒數(shù)
- LocalDate轉(zhuǎn)LocalDateTime
// atTime()可以提定時(shí)間(時(shí),分,秒),也可以傳LocalTime對(duì)象 LocalDate.now().atTime(0, 0, 0); // 如果不需要指定當(dāng)天時(shí)間,使用該方法指定時(shí)分秒為都為0 LocalDate.now().atStartOfDay();
- LocalTime轉(zhuǎn)LocalDateTime
LocalTime.now().atDate(LocalDate.now());
atDate()傳入LocalDate對(duì)象
- LocalDateTime轉(zhuǎn)LocalDate和LocalTime
// 獲得日期 LocalDate date = LocalDateTime.now().toLocalDate(); // 獲得時(shí)間 LocalTime time = LocalDateTime.now().toLocalTime();
- LocalDateTime與Date互轉(zhuǎn)
/**
* LocalDateTime轉(zhuǎn)udate
* @param datetime
* @return
*/
public static Date localDateTimeToUDate(LocalDateTime datetime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = datetime.atZone(zone).toInstant();
Date udate = Date.from(instant);
return udate;
}
/**
* udate轉(zhuǎn)LocalDateTime
* @param date
* @return
*/
public static LocalDateTime uDateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime;
}
時(shí)區(qū)
如果系統(tǒng)有境外用戶,可能需要針對(duì)各地區(qū)不同時(shí)區(qū)處理。Java中使用的是格林時(shí)間(UTC),我們可以使用 ZoneOffset 設(shè)置偏移位置。
// ZoneOffset.of("+8") 等價(jià) ZoneOffset.ofHours(8)
LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
格式化
在舊的Date類,使用 SimpleDateFormat 格式化日期,該類不是線程安全的。在新的日期類中使用 DateTimeFormatter
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
log.info("-> {}", formatter.format(now));
DateTimeFormatter 定義好一些預(yù)格式化方式,以下是參照表:

還可以自定義格式:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化
String str = formatter.format(LocalDateTime.now());
// 轉(zhuǎn)成LocalDateTime
LocalDateTime datetime = LocalDateTime.parse("2021-01-01 08:00:00", formatter);
以下是Pattern表達(dá)式參照表:

新的時(shí)間工具雖然復(fù)雜了些,但也更加靈活。以后的開發(fā)推薦使用新的工具包。
以上就是Java 日期時(shí)間工具包–java.time的使用的詳細(xì)內(nèi)容,更多關(guān)于java.time的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java 8新時(shí)間日期庫(kù)java.time的使用示例
- java 運(yùn)行報(bào)錯(cuò)has been compiled by a more recent version of the Java Runtime
- Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解
- Java8中LocalDateTime與時(shí)間戳timestamp的互相轉(zhuǎn)換
- Java中joda日期格式化工具的使用示例
- 史上最全Java8日期時(shí)間工具類(分享)
- java處理日期的工具類DateUtil
- java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類完整示例
- java常用工具類 Date日期、Mail郵件工具類
- java日期時(shí)間操作工具類
- java字符串與日期類型轉(zhuǎn)換的工具類
- java時(shí)間戳與日期相互轉(zhuǎn)換工具詳解
相關(guān)文章
SpringBoot使用slf4j日志并輸出到文件中的操作方法
這篇文章主要介紹了SpringBoot使用slf4j日志并輸出到文件中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
使用MAT進(jìn)行JVM內(nèi)存分析實(shí)例
這篇文章主要介紹了使用MAT進(jìn)行JVM內(nèi)存分析實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
JAVASE系統(tǒng)實(shí)現(xiàn)抽卡功能
這篇文章主要為大家詳細(xì)介紹了JAVASE系統(tǒng)實(shí)現(xiàn)抽卡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Spring?Security短信驗(yàn)證碼實(shí)現(xiàn)詳解
本文主要介紹了Spring?Security短信驗(yàn)證碼的實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11

