Java8?LocalDateTime時(shí)間日期類(lèi)使用實(shí)例詳解
前言
LocalDateTime 是 Java 8 中日期時(shí)間 API 提供的一個(gè)類(lèi),在日期和時(shí)間的表示上提供了更加豐富和靈活的支持。
LocalDateTime 類(lèi)相比于早期的 Date 和 Calendar 類(lèi)來(lái)說(shuō)有以下幾個(gè)優(yōu)勢(shì):
- 更加豐富的日期時(shí)間類(lèi)型支持: LocalDateTime 類(lèi)封裝了 LocalDate 和 LocalTime 兩個(gè)類(lèi),支持更加細(xì)化的日期時(shí)間操作,例如獲取某一天的開(kāi)始和結(jié)束時(shí)間、獲取某個(gè)時(shí)間段內(nèi)的所有日期等。
- 線程安全性: LocalDateTime 類(lèi)是不可變對(duì)象,線程安全性較高,可以在多線程環(huán)境下安全使用。
- 時(shí)區(qū)支持: LocalDateTime 類(lèi)在處理時(shí)區(qū)相關(guān)的操作時(shí)有著很好的支持,例如可以將一個(gè) LocalDateTime 對(duì)象轉(zhuǎn)換成 ZonedDateTime 對(duì)象,以支持更加復(fù)雜的時(shí)區(qū)計(jì)算。
LocalDateTime 類(lèi)的實(shí)現(xiàn)原理是基于 Java 的時(shí)間 API,其內(nèi)部實(shí)現(xiàn)主要依賴(lài)于 Java 中的 long 類(lèi)型和標(biāo)準(zhǔn) Unix 時(shí)間戳來(lái)表示日期時(shí)間。具體來(lái)說(shuō),LocalDateTime 內(nèi)部包含了一個(gè) long 類(lèi)型的字段,用于表示自 UTC(協(xié)調(diào)世界時(shí))1970 年 1 月 1 日 00:00:00 開(kāi)始經(jīng)過(guò)的毫秒數(shù)(即 Unix 時(shí)間戳),通過(guò)對(duì)這個(gè)時(shí)間戳的操作來(lái)實(shí)現(xiàn) LocalDateTime 類(lèi)的各種功能。
同時(shí),在實(shí)現(xiàn)時(shí)區(qū)相關(guān)的操作時(shí),LocalDateTime 類(lèi)還依賴(lài)于 Java 中的時(shí)區(qū)類(lèi)(例如 ZoneId 和 ZoneOffset),通過(guò)將 LocalDateTime 轉(zhuǎn)換為 ZonedDateTime 或 OffsetDateTime 對(duì)象來(lái)實(shí)現(xiàn)時(shí)區(qū)相關(guān)的計(jì)算。
一、LocalDateTime 的創(chuàng)建
LocalDateTime 類(lèi)通過(guò)提供許多靜態(tài)方法來(lái)創(chuàng)建對(duì)象,這些方法包括:
1. of() 方法
of() 方法用于根據(jù)指定的年、月、日、時(shí)、分、秒和納秒值創(chuàng)建一個(gè) LocalDateTime 對(duì)象,其語(yǔ)法如下:
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
其中,year、month、dayOfMonth、hour、minute、second 和 nanoOfSecond 分別表示年、月、日、時(shí)、分、秒和納秒值。
例如,以下代碼創(chuàng)建了一個(gè) LocalDateTime 對(duì)象,表示 2019 年 10 月 30 日 14 點(diǎn) 30 分 0 秒:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0);
2. now() 方法
now() 方法用于獲取當(dāng)前系統(tǒng)時(shí)間的 LocalDateTime 對(duì)象,其語(yǔ)法如下:
public static LocalDateTime now()
例如,以下代碼創(chuàng)建了一個(gè) LocalDateTime 對(duì)象,表示當(dāng)前系統(tǒng)時(shí)間:
LocalDateTime dateTime = LocalDateTime.now();
3. parse() 方法
parse() 方法用于將一個(gè)字符串解析成 LocalDateTime 對(duì)象,其語(yǔ)法如下:
public static LocalDateTime parse(CharSequence text) public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
其中,text 表示要解析的字符串,formatter 表示日期時(shí)間格式化對(duì)象。如果不指定 formatter,則默認(rèn)使用 ISO_LOCAL_DATE_TIME
格式。
例如,以下代碼創(chuàng)建了一個(gè) LocalDateTime 對(duì)象,表示 2019 年 10 月 30 日 14 點(diǎn) 30 分 0 秒:
LocalDateTime dateTime = LocalDateTime.parse("2019-10-30T14:30:00");
4. from() 方法
from()方法用于將一個(gè) TemporalAccessor 對(duì)象轉(zhuǎn)換成 LocalDateTime 對(duì)象,其語(yǔ)法如下:
public static LocalDateTime from(TemporalAccessor temporal)
例如,以下代碼將一個(gè) ZonedDateTime 對(duì)象轉(zhuǎn)換成 LocalDateTime 對(duì)象:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); LocalDate date = dateTime.toLocalDate();
二、LocalDateTime 的轉(zhuǎn)換
LocalDateTime 類(lèi)提供了許多方便的轉(zhuǎn)換方法,我們可以把 LocalDateTime 轉(zhuǎn)換成其他類(lèi)型,或者把其他類(lèi)型轉(zhuǎn)換成 LocalDateTime。這些方法包括:
1. toLocalDate() 方法
toLocalDate()方法用于把 LocalDateTime 對(duì)象轉(zhuǎn)換成 LocalDate 對(duì)象,其語(yǔ)法如下:
public LocalDate toLocalDate()
例如,以下代碼將一個(gè) LocalDateTime 對(duì)象轉(zhuǎn)換成 LocalDate 對(duì)象:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); LocalDate date = dateTime.toLocalDate();
2. toLocalTime() 方法
toLocalTime()方法用于把 LocalDateTime 對(duì)象轉(zhuǎn)換成 LocalTime 對(duì)象,其語(yǔ)法如下:
public LocalTime toLocalTime()
例如,以下代碼將一個(gè) LocalDateTime 對(duì)象轉(zhuǎn)換成 LocalTime 對(duì)象:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); LocalTime time = dateTime.toLocalTime();
3. atOffset() 方法
atOffset() 方法用于把 LocalDateTime 對(duì)象轉(zhuǎn)換成帶偏移量的 OffsetDateTime 對(duì)象,其語(yǔ)法如下:
public OffsetDateTime atOffset(ZoneOffset offset)
其中,offset 表示要添加的時(shí)區(qū)偏移量。
例如,以下代碼將一個(gè) LocalDateTime 對(duì)象轉(zhuǎn)換成帶偏移量的 OffsetDateTime 對(duì)象:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); ZoneOffset offset = ZoneOffset.of("+08:00"); OffsetDateTime offsetDateTime = dateTime.atOffset(offset);
4. toEpochSecond() 方法
toEpochSecond() 方法用于把 LocalDateTime 對(duì)象轉(zhuǎn)換成 Unix 時(shí)間戳,其語(yǔ)法如下:
public long toEpochSecond(ZoneOffset offset)
例如,以下代碼把一個(gè) LocalDateTime 對(duì)象轉(zhuǎn)換成 Unix 時(shí)間戳:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); ZoneOffset offset = ZoneOffset.of("+08:00"); long epochSecond = dateTime.toEpochSecond(offset);
5. from() 方法
from() 方法用于將一個(gè) TemporalAccessor 對(duì)象轉(zhuǎn)換成 LocalDateTime 對(duì)象,其語(yǔ)法與前面講解的相同,這里不再贅述。
三、LocalDateTime 的格式化與解析
日期時(shí)間的格式化與解析是 Java 8 中日期時(shí)間 API 中的重要功能。LocalDateTime 類(lèi)通過(guò)內(nèi)置的 DateTimeFormatter 類(lèi)以及一些方法來(lái)實(shí)現(xiàn)格式化和解析。下面我們將詳細(xì)介紹 LocalDateTime 類(lèi)的格式化和解析方法。
1. format() 方法
format() 方法用于將 LocalDateTime 對(duì)象格式化成字符串,其語(yǔ)法如下:
public String format(DateTimeFormatter formatter)
其中,formatter 表示日期時(shí)間格式化對(duì)象。
例如,以下代碼將一個(gè) LocalDateTime 對(duì)象格式化成 " yyyy-MM-dd HH:mm:ss " 格式的字符串:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String strDate = dateTime.format(formatter);
2. parse() 方法
parse() 方法用于將一個(gè)字符串解析成 LocalDateTime 對(duì)象,其語(yǔ)法在前面已經(jīng)介紹過(guò),這里不再贅述。
例如,以下代碼將一個(gè)字符串解析成 LocalDateTime 對(duì)象:
LocalDateTime dateTime = LocalDateTime.parse("2019-10-30T14:30:00");
3. DateTimeFormatter 類(lèi)
DateTimeFormatter 類(lèi)是 Java 8 中提供的日期時(shí)間格式化類(lèi),它提供了多種內(nèi)置的格式化方式,同時(shí)也可以自定義日期時(shí)間格式。常用的幾種內(nèi)置格式化方式包括:
ofPattern() 方法 :使用指定的模式字符串創(chuàng)建一個(gè) DateTimeFormatter 對(duì)象。
public static DateTimeFormatter ofPattern(String pattern)
例如,以下代碼創(chuàng)建了一個(gè) " yyyy-MM-dd HH:mm:ss " 格式的 DateTimeFormatter 對(duì)象:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ISO_LOCAL_DATE_TIME :表示格式為 "yyyy-MM-ddTHH:mm:ss" 的日期時(shí)間。
public static final DateTimeFormatter ISO_LOCAL_DATE_TIME
例如,以下代碼創(chuàng)建了一個(gè) " yyyy-MM-ddTHH:mm:ss " 格式的 DateTimeFormatter 對(duì)象:
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
ISO_LOCAL_DATE :表示格式為 "yyyy-MM-dd" 的日期。
public static final DateTimeFormatter ISO_LOCAL_DATE
例如,以下代碼創(chuàng)建了一個(gè) " yyyy-MM-dd " 格式的 DateTimeFormatter 對(duì)象:
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
四、LocalDateTime 的計(jì)算與比較
LocalDateTime 類(lèi)還提供了一些方法來(lái)進(jìn)行日期時(shí)間的計(jì)算和比較。這些方法包括:
1. plusXxx() 和 minusXxx() 方法
plusXxx() 和 minusXxx() 方法分別用于在當(dāng)前 LocalDateTime 對(duì)象上加上或減去指定的日期時(shí)間量,其中 Xxx 表示日期時(shí)間單位,如:Years、Months、Days、Hours、Minutes、Seconds 和 Nanos。
例如,以下代碼將一個(gè) LocalDateTime 對(duì)象加上 1 年并減去 1 月:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); dateTime = dateTime.plusYears(1).minusMonths(1);
2. withXxx() 方法
withXxx() 方法用于以指定的日期時(shí)間量來(lái)修改 LocalDateTime 對(duì)象的對(duì)應(yīng)字段,其他字段不變,其中 Xxx 表示日期時(shí)間單位,如:Year、Month、DayOfMonth、Hour、Minute、Second 和 Nano。
例如,以下代碼將 LocalDateTime 對(duì)象的年份修改為 2020 年:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); dateTime = dateTime.withYear(2020);
3. isBefore() 和 isAfter() 方法
isBefore() 和 isAfter() 方法分別用于判斷兩個(gè) LocalDateTime 對(duì)象的先后順序。其中, isBefore() 方法用于判斷當(dāng)前 LocalDateTime 對(duì)象是否在參數(shù)對(duì)象之前, isAfter() 方法用于判斷當(dāng)前 LocalDateTime 對(duì)象是否在參數(shù)對(duì)象之后。
例如,以下代碼判斷兩個(gè) LocalDateTime 對(duì)象的先后順序:
LocalDateTime dateTime1 = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); LocalDateTime dateTime2 = LocalDateTime.of(2020, 10, 30, 14, 30, 0, 0); boolean before = dateTime1.isBefore(dateTime2); // true boolean after = dateTime1.isAfter(dateTime2); // false
五、LocalDateTime 的其他操作
LocalDateTime 類(lèi)還提供了一些其他操作,這些操作包括:
1. with() 方法
with() 方法用于以指定的 TemporalAdjuster 對(duì)象或者方法來(lái)修改 LocalDateTime 對(duì)象,例如,以下代碼將 LocalDateTime 對(duì)象的日期調(diào)整為當(dāng)前月份的第一天:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); dateTime = dateTime.with(TemporalAdjusters.firstDayOfMonth());
其中,TemporalAdjusters 是 Java 8 中提供的一個(gè)類(lèi),它提供了許多方便的日期時(shí)間調(diào)整器,如: firstDayOfMonth() 、 lastDayOfMonth() 、 next() 、 previous() 等。通過(guò)調(diào)用這些方法可以生成對(duì)應(yīng)的 TemporalAdjuster 對(duì)象。
2. getXXX() 方法
getXXX() 方法用于獲取 LocalDateTime 對(duì)象的指定字段值,其中 Xxx 表示日期時(shí)間單位,如:Year、Month、DayOfMonth、Hour、Minute、Second 和 Nano。
例如,以下代碼獲取 LocalDateTime 對(duì)象的月份和分鐘數(shù):
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); int month = dateTime.getMonthValue(); // 10 int minute = dateTime.getMinute(); // 30
3. getDayOfWeek() 和 getDayOfMonth() 方法
getDayOfWeek() 和 getDayOfMonth() 方法分別用于獲取 LocalDateTime 對(duì)象所表示日期的星期幾和哪一天。例如,以下代碼獲取 LocalDateTime 對(duì)象的星期幾和哪一天:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); DayOfWeek dayOfWeek = dateTime.getDayOfWeek(); // WEDNESDAY int dayOfMonth = dateTime.getDayOfMonth(); // 30
4. toInstant() 方法
toInstant() 方法用于獲取 LocalDateTime 對(duì)象的 Instant 對(duì)象,其中 Instant 對(duì)象表示了從 1970 年 1 月 1 日 00:00:00 GMT 開(kāi)始的毫秒數(shù)例如,以下代碼獲取 LocalDateTime 對(duì)象的 Instant 對(duì)象:
LocalDateTime dateTime = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); Instant instant = dateTime.toInstant();
5. compareTo() 方法
compareTo() 方法用于比較兩個(gè) LocalDateTime 對(duì)象的順序大小,如果當(dāng)前對(duì)象在參數(shù)對(duì)象之前,則返回負(fù)數(shù),如果當(dāng)前對(duì)象在參數(shù)對(duì)象之后,則返回正數(shù),如果兩個(gè)對(duì)象相等,則返回 0。
例如,以下代碼比較兩個(gè) LocalDateTime 對(duì)象的順序:
LocalDateTime dateTime1 = LocalDateTime.of(2019, 10, 30, 14, 30, 0, 0); LocalDateTime dateTime2 = LocalDateTime.of(2020, 10, 30, 14, 30, 0, 0); int result = dateTime1.compareTo(dateTime2); // -1
總結(jié)
本文從 LocalDateTime 類(lèi)的創(chuàng)建、轉(zhuǎn)換、格式化與解析、計(jì)算與比較以及其他操作幾個(gè)方面詳細(xì)介紹了 LocalDateTime 類(lèi)在 Java 8 中的使用。
掌握 LocalDateTime 類(lèi)的使用可以大大提高日期時(shí)間處理效率和質(zhì)量,希望本文對(duì)讀者有所幫助。
到此這篇關(guān)于Java8 - LocalDateTime時(shí)間日期類(lèi)使用詳解的文章就介紹到這了,更多相關(guān)Java8 LocalDateTime時(shí)間日期類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java8?LocalDateTime時(shí)間日期類(lèi)使用實(shí)例詳解
- Java8時(shí)間api之LocalDate/LocalDateTime的用法詳解
- Java8時(shí)間接口LocalDateTime詳細(xì)用法
- Java8中LocalDateTime與時(shí)間戳timestamp的互相轉(zhuǎn)換
- Java8中的LocalDateTime和Date一些時(shí)間操作方法
- Java8 LocalDateTime極簡(jiǎn)時(shí)間日期操作小結(jié)
- Java8時(shí)間轉(zhuǎn)換(LocalDateTime)代碼實(shí)例
- java8 LocalDate LocalDateTime等時(shí)間類(lèi)用法實(shí)例分析
- Java8日期類(lèi)LocalDate、LocalTime和LocalDateTime使用方法詳解
- mybatis如何使用Java8的日期LocalDate和LocalDateTime詳解
相關(guān)文章
MyBatis-Plus如何最優(yōu)雅最簡(jiǎn)潔地完成數(shù)據(jù)庫(kù)操作
Mybatis-Plus是一個(gè)?Mybatis?的增強(qiáng)工具,在?Mybatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何最優(yōu)雅最簡(jiǎn)潔地完成數(shù)據(jù)庫(kù)操作的相關(guān)資料,需要的朋友可以參考下2022-03-03javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(二)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),利用mybatis創(chuàng)建DAO層,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Spring MVC 自定義數(shù)據(jù)轉(zhuǎn)換器的思路案例詳解
本文通過(guò)兩個(gè)案例來(lái)介紹下Spring MVC 自定義數(shù)據(jù)轉(zhuǎn)換器的相關(guān)知識(shí),每種方法通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)
在本篇文章里小編給大家分享的是一篇關(guān)于java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)的內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02JavaWeb HttpServletResponse對(duì)象及常用方法
這篇文章主要介紹了JavaWeb-HttpServletResponse對(duì)象,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日詳細(xì)代碼
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日的相關(guān)資料,獲取并處理節(jié)假日數(shù)據(jù)是一個(gè)常見(jiàn)需求,特別是在需要安排任務(wù)調(diào)度、假期通知等功能的場(chǎng)景中,需要的朋友可以參考下2024-05-05解決JMap抓取heap使用統(tǒng)計(jì)信息報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決JMap抓取heap使用統(tǒng)計(jì)信息報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12mybatis注解如何實(shí)現(xiàn)對(duì)象批量更改
這篇文章主要介紹了mybatis注解實(shí)現(xiàn)對(duì)象批量更改的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java線程并發(fā)工具類(lèi)CountDownLatch原理及用法
這篇文章主要介紹了Java線程并發(fā)工具類(lèi)CountDownLatch原理及用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10