最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于LocalDateTime使用詳解

 更新時(shí)間:2024年08月02日 10:30:45   作者:Gambler_Tu  
這篇文章主要介紹了關(guān)于LocalDateTime使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用 LocalDateTime 替代 Date

JDK 中的 Date 的缺點(diǎn):

  • Date 如果不格式化,打印出的日期可讀性差;
  • 使用 SimpleDateFormat 可以對(duì)日期時(shí)間進(jìn)行格式化,但是 SimpleDateFormat 并非線性安全;
  • Date 對(duì)時(shí)間處理比較麻煩;
  • Date 這個(gè)類(lèi)名的命名并不嚴(yán)謹(jǐn)。

另外,《阿里巴巴開(kāi)發(fā)手冊(cè)》中明確禁用 static 關(guān)鍵字修飾 SimpleDateFormat 。

Java 官方請(qǐng)著名的第三方日期時(shí)間包 joda-time 的作者重新設(shè)計(jì)了與日期時(shí)間有關(guān)的 API 部分,并把它們放在了 jdk 8 的 java.time 包下。

新增了:LocalDate、LocalTime、LocalDateTime 三個(gè)類(lèi)及相關(guān)新的 API 用以替代 Date 及其舊的使用方式。

1. LocalDate

只會(huì)獲取 年月日 信息。

LocalDate 中并不包含『時(shí)區(qū)』信息。即,一個(gè)單獨(dú)的 LocalDate 對(duì)象所表達(dá)的含義是不嚴(yán)謹(jǐn)?shù)摹?LocalTime 和 LocalDateTime 也一樣。

  • 創(chuàng)建 LocalDate 對(duì)象
LocalDate localDate = LocalDate.now();
LocalDate localDate = LocalDate.of(2000, 1, 1);
  • 獲取年、月、日、星期幾
LocalDate localDate = LocalDate.now();

int year = localDate.getYear();
int year = localDate.get(ChronoField.YEAR);

Month month = localDate.getMonth();
int month = localDate.get(ChronoField.MONTH_OF_YEAR);

int day = localDate.getDayOfMonth();
int day = localDate.get(ChronoField.DAY_OF_MONTH);

DayOfWeek dayOfWeak = localDate.getDayOfWeek();
int dayOfWeak = localDate.get(ChronoField.DAY_OF_WEEK);

2. LocalTime

只會(huì)獲取 時(shí)分秒 信息。

  • 創(chuàng)建 LocalTime 對(duì)象
LocalTime localTime = LocalTime.now();
LocalTime localTime = LocalTime.of(17, 30, 0);
  • 獲取時(shí)分秒
int hour = localTime.getHour();
int hour = localTime.get(ChronoField.HOUR_OF_DAY);

int minute = localTime.getMinute();
int minute = localTime.get(ChronoField.MINUTE_OF_HOUR);

int second = localTime.getSecond();
int second = localTime.get(ChronoField.SECOND_OF_MINUTE);

3. LocaDateTime

獲取 年月日時(shí)分秒,等于 LocalDate + LocalTime

  • 創(chuàng)建 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime = localDate.atTime(localTime);
LocalDateTime localDateTime = localTime.atDate(localDate);
  • 獲取 LocalDate
LocalDate localDate = localDateTime.toLocalDate();
  • 獲取 LocalTime
LocalTime localTime = localDateTime.toLocalTime();

4. Instant

在 Java 中,一個(gè) Instant 對(duì)象標(biāo)識(shí)時(shí)間軸上的一個(gè)點(diǎn),代表著一個(gè)概念上的瞬間。

原點(diǎn)』是眾所周知的 1970 年 1 月 1 日的午夜,此時(shí)本初子午線正在穿過(guò)倫敦格林威治皇家天文臺(tái)。

從『原點(diǎn)』開(kāi)始,時(shí)間按照每天 86400 秒進(jìn)行正向、反向計(jì)算,向前、向后分別以納秒為單位。

  • warning 注意:
  • Instant 是有時(shí)區(qū)概念的,在你未指定時(shí),它的默認(rèn)時(shí)區(qū)時(shí) 0 時(shí)區(qū),即,格林威治時(shí)間。

雖然 Instant 內(nèi)部是以納秒為單位進(jìn)行存儲(chǔ)、運(yùn)算的,但是很顯然你可以將它轉(zhuǎn)換成相較于『原點(diǎn) (epoch) 』的時(shí)、分、秒。

在編程世界中,我們?nèi)粘I钪兴f(shuō)的『』使用的是 second ;而『相較于原點(diǎn)的秒』使用的是 epoch second 。 epoch 是時(shí)代、紀(jì)元等含義。

另外,在 Java 8 中,使用 Duration 對(duì)象來(lái)代表兩個(gè) Instant 之間的時(shí)間跨度。

  • 創(chuàng)建 Instant 對(duì)象
Instant instant = Instant.now();
  • 獲取秒數(shù)
long currentSecond = instant.getEpochSecond();
  • 獲取毫秒數(shù)
long currentMilli = instant.toEpochMilli();

個(gè)人覺(jué)得如果只是為了獲取秒數(shù)或者毫秒數(shù),使用 System.currentTimeMillis() 來(lái)得更為方便。

5. 修改 LocalDate、LocalTime、LocalDateTime、Instant

LocalDate、LocalTime、LocalDateTime、Instant 為『不可變對(duì)象』,修改這些對(duì)象對(duì)象會(huì)返回一個(gè)副本,即生成并返回一個(gè)新對(duì)象。

  • 增加、減少年數(shù)、月數(shù)、天數(shù)等 以 LocalDateTime 為例
LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);

// 增加一年
localDateTime = localDateTime.plusYears(1);
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS);

// 減少一個(gè)月
localDateTime = localDateTime.minusMonths(1);
localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS);
  • 通過(guò) with 修改某些值
// 修改年為 2019
localDateTime = localDateTime.withYear(2020);
// 修改為 2022
localDateTime = localDateTime.with(ChronoField.YEAR, 2022);

// 還可以修改月、日

6. 使用 TemporalAdjuster 和 TemporalAdjusters

有的時(shí)候,你需要進(jìn)行一些更加復(fù)雜的日期操作,比如,將日期調(diào)整到下個(gè)周日、下個(gè)工作日,或者是本月的最后一天。這時(shí),你可以使用重載版本的 withXXX 方法,向其傳遞一個(gè)提供了更多定制化選擇的 TemporalAdjuster 對(duì)象, 更加靈活地處理日期。

比如有些時(shí)候想知道這個(gè)月的最后一天是幾號(hào)、下個(gè)周末是幾號(hào),通過(guò)提供的時(shí)間和日期API可以很快得到答案。

對(duì)于最常見(jiàn)的用例,日期和時(shí)間 API 已經(jīng)提供了大量預(yù)定義的 TemporalAdjuster 對(duì)象。你可以通過(guò) TemporalAdjusters (注意,此處有 s) 類(lèi)的靜態(tài)工廠方法訪問(wèn)它們。

TemporalAdjusters 類(lèi)中的常用工廠方法:

  • dayOfWeekInMonth 創(chuàng)建一個(gè)新的日期,它的值為同一個(gè)月中每一周的第幾天
  • firstDayOfMonth 創(chuàng)建一個(gè)新的日期,它的值為當(dāng)月的第一天
  • firstDayOfNextMonth 創(chuàng)建一個(gè)新的日期,它的值為下月的第一天
  • firstDayOfNextYear 創(chuàng)建一個(gè)新的日期,它的值為明年的第一天
  • firstDayOfYear 創(chuàng)建一個(gè)新的日期,它的值為當(dāng)年的第一天
  • firstInMonth 創(chuàng)建一個(gè)新的日期,它的值為同一個(gè)月中,第一個(gè)符合星期幾要求的值
  • lastDayOfMonth 創(chuàng)建一個(gè)新的日期,它的值為當(dāng)月的最后一天
  • lastDayOfNextMonth 創(chuàng)建一個(gè)新的日期,它的值為下月的最后一天
  • lastDayOfNextYear 創(chuàng)建一個(gè)新的日期,它的值為明年的最后一天
  • lastDayOfYear 創(chuàng)建一個(gè)新的日期,它的值為今年的最后一天
  • lastInMonth 創(chuàng)建一個(gè)新的日期,它的值為同一個(gè)月中,最后一個(gè)符合星期幾要求的值
  • next / previous 創(chuàng)建一個(gè)新的日期,并將其值設(shè)定為日期調(diào)整后或者調(diào)整前,第一個(gè)符合指定星 期幾要求的日期
  • nextOrSame / previousOrSame 創(chuàng)建一個(gè)新的日期,并將其值設(shè)定為日期調(diào)整后或者調(diào)整前,第一個(gè)符合指定星 期幾要求的日期,如果該日期已經(jīng)符合要求,直接返回該對(duì)象

7. 格式化時(shí)間

DateTimeFormatter 默認(rèn)提供了多種格式化方式,如果默認(rèn)提供的不能滿(mǎn)足要求,可以通過(guò) DateTimeFormatter 的 ofPattern 方法創(chuàng)建自定義格式化方式。

LocalDate localDate = LocalDate.of(2019, 9, 10);
String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);

// 自定義格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String s3 = localDate.format(dateTimeFormatter);

8. 解析時(shí)間

相較于傳統(tǒng)的 SimpleDateFormat,DateTimeFormatter 是線程安全的

LocalDate localDate1 = LocalDate.parse("20190910", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate localDate2 = LocalDate.parse("2019-09-10", DateTimeFormatter.ISO_LOCAL_DATE);

Date 與 LocalDate 互轉(zhuǎn):

  • Date 轉(zhuǎn) LocalDate
// Date 轉(zhuǎn) LocalDate
public static LocalDate date2LocalDate(Date date) {
  return (date == null) ? (null) : (date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
}
  • LocalDate 轉(zhuǎn) Date
//  LocalDate轉(zhuǎn)Date
public static Date localDate2Date(LocalDate localDate) {
  return (localDate == null) ? (null) : (Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
}

9. 帶時(shí)區(qū)的時(shí)間

LocalDate、LocalTime 和 LocalDateTime 是不帶時(shí)區(qū)信息的。在 JDK 8 中,帶有時(shí)區(qū)信息的日期時(shí)間類(lèi)是 ZonedDateTime

因特網(wǎng)編號(hào)管理局 (IANA) 維護(hù)著一份全球所有已知時(shí)區(qū)的數(shù)據(jù)庫(kù)(http://www.iana.org/time-zones),每年會(huì)更新幾次(這些更新主要處理夏令時(shí)規(guī)則的改變)。Java 就是使用了 IANA 的數(shù)據(jù)庫(kù)。

在 Java 中,每個(gè)時(shí)區(qū)都有一個(gè) ID,例如 Asia/Shanghai 。想要獲得所有可用的時(shí)區(qū),你可以調(diào)用 ZoneId.getAvailableZoneIds() 。 大概有 600 個(gè)。

如果你想獲得 ZonedDateTime 對(duì)象,你有 2 種途徑:

  • 直接使用 ZonedDateTime.of() 方法創(chuàng)建;
  • 先創(chuàng)建一個(gè) LocalDateTime 對(duì)象 (它不含時(shí)區(qū)概念) ,再調(diào)用它的 atZone 方法,賦予它時(shí)區(qū)的概念,生成 ZonedDateTime 對(duì)象。

10. SpringBoot 中應(yīng)用 LocalDateTime

將 LocalDateTime 字段以時(shí)間戳的方式返回給前端。

添加日期轉(zhuǎn)化類(lèi):

public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
    }
}

并在 LocalDateTime 字段上添加 @JsonSerialize(using = LocalDateTimeConverter.class) 注解,如下:

@JsonSerialize(using = LocalDateTimeConverter.class)
protected LocalDateTime gmtModified;

將 LocalDateTime 字段以指定格式化日期的方式返回給前端

在 LocalDateTime 字段上添加 @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 注解即可,如下:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;

對(duì)前端傳入的日期進(jìn)行格式化

在 LocalDateTime 字段上添加 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解即可,如下:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;

Java Date and Time API 用在持久層

LocalDateTime in Mybatis

MyBatis 從 3.4.5 版本開(kāi)始就完全支持這種類(lèi)型了,不在需要自己去寫(xiě)類(lèi)型轉(zhuǎn)換 。

LocalDateTime in spring-data-jpa

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-java8</artifactId>
</dependency>

LocalDateTime in spring-data-redis

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你了解Spring中存入Bean和獲取Bean的方式

    一文帶你了解Spring中存入Bean和獲取Bean的方式

    這篇文章主要帶大家了解Spring中存入Bean和獲取Bean的方式,文中的代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • spring boot高并發(fā)下耗時(shí)操作的實(shí)現(xiàn)方法

    spring boot高并發(fā)下耗時(shí)操作的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于spring boot高并發(fā)下耗時(shí)操作的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 深入理解Java中的Properties類(lèi)

    深入理解Java中的Properties類(lèi)

    Properties類(lèi)是Java中用于處理配置文件的工具類(lèi),它繼承自 Hashtable類(lèi),實(shí)現(xiàn)了Map接口,本文主要介紹了Java中的Properties類(lèi),感興趣的可以了解一下
    2024-01-01
  • Java利用Spire.XLS for Java實(shí)現(xiàn)自動(dòng)化生成PDF文檔

    Java利用Spire.XLS for Java實(shí)現(xiàn)自動(dòng)化生成PDF文檔

    在 Java 后端高效靈活地實(shí)現(xiàn) PDF 文檔的生成,常常是困擾開(kāi)發(fā)者的一個(gè)痛點(diǎn),本文將為您介紹如何利用 Spire.XLS for Java 輕松駕馭 Java 中的 PDF 文檔生成,感興趣的小伙伴可以了解下
    2026-02-02
  • Java之Set String List互轉(zhuǎn)方式

    Java之Set String List互轉(zhuǎn)方式

    文章總結(jié)了Java中Set與String以及List之間的相互轉(zhuǎn)換方法,通過(guò)代碼示例展示了如何將Set轉(zhuǎn)為L(zhǎng)ist,再將List轉(zhuǎn)為Set,以及如何將List轉(zhuǎn)為String,最后又將String轉(zhuǎn)為L(zhǎng)ist的過(guò)程
    2026-04-04
  • SpringSecurity實(shí)現(xiàn)登陸認(rèn)證并返回token方式

    SpringSecurity實(shí)現(xiàn)登陸認(rèn)證并返回token方式

    這篇文章主要介紹了SpringSecurity實(shí)現(xiàn)登陸認(rèn)證并返回token方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringBoot整合SpringAI配置多平臺(tái)API密鑰的解決方案

    SpringBoot整合SpringAI配置多平臺(tái)API密鑰的解決方案

    本文介紹了如何在SpringBoot項(xiàng)目中整合SpringAI配置平臺(tái)API密鑰,包括添加依賴(lài)、配置文件、配置屬性類(lèi)及核心配置類(lèi)等,通過(guò)動(dòng)態(tài)切換不同AI平臺(tái),實(shí)現(xiàn)統(tǒng)一接口調(diào)用,此外,支持YAML配置和環(huán)境變量,便于靈活配置和擴(kuò)展新平臺(tái),需要的朋友可以參考下
    2026-05-05
  • 關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列

    關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列

    這篇文章主要介紹了關(guān)于SpringBoot整合RabbitMQ實(shí)現(xiàn)死信隊(duì)列,死信隊(duì)列實(shí)際上就是一個(gè)普通的隊(duì)列,只是這個(gè)隊(duì)列跟死信交換機(jī)進(jìn)行了綁定,用來(lái)存放死信而已,需要的朋友可以參考下
    2023-05-05
  • 2020最新eclipse安裝過(guò)程及細(xì)節(jié)

    2020最新eclipse安裝過(guò)程及細(xì)節(jié)

    這篇文章主要介紹了2020最新eclipse安裝過(guò)程及細(xì)節(jié),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 淺談Java內(nèi)部類(lèi)——靜態(tài)內(nèi)部類(lèi)

    淺談Java內(nèi)部類(lèi)——靜態(tài)內(nèi)部類(lèi)

    這篇文章主要介紹了Java靜態(tài)內(nèi)部類(lèi)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java內(nèi)部類(lèi)的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

琼结县| 同江市| 天长市| 襄城县| 内丘县| 合阳县| 章丘市| 武胜县| 沧源| 阳西县| 贺州市| 龙陵县| 沧源| 璧山县| 进贤县| 军事| 宣威市| 祥云县| 洛扎县| 织金县| 盐城市| 塔城市| 江达县| 凤城市| 黄冈市| 东丽区| 濮阳县| 龙江县| 灵川县| 中阳县| 临桂县| 班玛县| 洮南市| 兴隆县| 富锦市| 东台市| 大丰市| 清远市| 安义县| 琼结县| 临夏县|