亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java 8 時間 API 快速入門

taoszu / 3609人閱讀

摘要:的操作加減相互比較獲得時間差。表示一天當(dāng)中的時間,其精確度到納秒。既包含日期也包含時間,但是不包含時區(qū)。此外一個對象和一個對象可以組合為一個對象。表示以天為單位的時長,精確到天。

Java 8 出來很久了,各位也可能已經(jīng)在用了,不過其中新的時間日期 API 可能很少人用,甚至不知道怎么上手。本文快速介紹一下其中的主要的類的概念和用法。

一、時間戳 Instant

Instant 表示一個 EPOCH 時間戳(即以 0 表示 1970-01-01T00:00:00Z),精確到納秒。Instant 對象不包含時區(qū)信息,且值是不可變的。

雖然概念很簡單,但是它可以很方便的和其他時間日期對象之間進行交互和轉(zhuǎn)換。比如:

兩個 Instant 可以用來構(gòu)建一個時間段;

一個 Instant 加上一個時長可以得到另一個 Instant;

一個 Instant 加上一個時區(qū)可以得到一個 ZonedDateTime 對象。

? 創(chuàng)建 Instant

首先 Instant 有下面幾個常量:

Instant.EPOCH 表示 1970-01-01T00:00:00Z

Instant.MIN 表示 Instant 可度量的最早時間,公元前十億年

Instant.MAX 表示 Instant 可度量的最晚時間,公元十億年

我們也可以通過一些靜態(tài)方法來創(chuàng)建:

Instant.now() 表示當(dāng)前時間戳

Instant.ofEpochMilli(long milliSec) 通過現(xiàn)有的毫秒時間戳來創(chuàng)建 Instant 對象

Instant.ofEpochSecond(long seconds) 通過現(xiàn)有的秒時間戳來創(chuàng)建 Instant 對象

? 從 Instant 取值

Instant 對象包含兩個值:秒數(shù)和納秒數(shù)。其中秒數(shù)指的是 epoch 時間戳,而納秒數(shù)指的是該秒內(nèi)的納秒時間。由此可知,Instant 對象的精確度比 System.currentTimeMillis() 高到不知道哪去了。

所以從 Instant 可以取到兩個值:Instant.getEpochSecond() 獲取秒數(shù)部分,Instant.getNano() 獲取納秒部分。

? Instant 的操作

加減:plus(), minus();

相互比較:isAfter(), isBefore()

獲得時間差:until()。

下面是幾個例子:

Instant instant1 = Instant.now();
Instant instant2 = instant1.plus(Duration.ofSeconds(100));        // 添加 100 秒
System.out.println(instant2.isAfter(instant1));                   // true
System.out.println(instant1.until(instant2, ChronoUnit.SECONDS)); // 100
? 將 Instant 轉(zhuǎn)換成完整的時間

這部分將在后面介紹。

二、本地日期 / 本地時間 / 本地日期時間
LocalDate/LocalTime/LocalDateTime

LocalDate 表示年月日,其精確度到天。它是不包含時分秒的。

LocalTime 表示一天當(dāng)中的時間,其精確度到納秒。它是不包含年月日的。

LocalDateTime 既包含日期也包含時間,但是不包含時區(qū)。它實際上就是 LocalDateLocalTime 的組合。

? 創(chuàng)建 LocalDate/LocalTime/LocalDateTime 對象

這三個類都有下面的幾個靜態(tài)方法來創(chuàng)建對象:

now() 表示當(dāng)前時間或日期的對象;

of() 使用指定的值來創(chuàng)建;

parse() 通過解析字符串來創(chuàng)建。

此外一個 LocalDate 對象和一個 LocalTime 對象可以組合為一個 LocalDateTime 對象。

下面是幾個例子:

LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.of(2018, 3, 5);
LocalDateTime localDateTime = LocalDateTime.parse("2018-03-05T12:34:56");

// 下面兩句是等價的
LocalDateTime localDateTime1 = localDate.atTime(localTime);
LocalDateTime localDateTime2 = localTime.atDate(localDate);

此外它們還有各自的創(chuàng)建對象的靜態(tài)方法,具體請參考 API 文檔。

到了這里你可能發(fā)現(xiàn) LocalDateTimeInstance 本質(zhì)上是一樣的,都表示一個全局跨度內(nèi)的一個時間點。那么兩者是否可以互換呢?很可惜,不能直接互換。

因為 LocalDateTime 沒有帶時區(qū),而 Instance 的時間戳是統(tǒng)一以格林尼治時間為準的,所以相同的 LocalDateTime 在不同時區(qū)的 EPOCH 時間戳不同,轉(zhuǎn)換的時候必須附加一個時區(qū)。下面是例子:

// LocalDateTime -> Instant
Instant instant = Instant
        .from(LocalDateTime.now().atZone(ZoneId.systemDefault()));
        
// 或者
Instant instant = Instant.from(ZonedDateTime.now());

// Instant -> LocalDateTime
LocalDateTime localDateTime = LocalDateTime
        .ofInstant(Instant.now(), ZoneId.systemDefault()); 
三、時長 Duration/Period

Duration 表示以秒為單位的時長,精確到納秒。Period 表示以天為單位的時長,精確到天。

? 創(chuàng)建 Duration/Period

有三類方法可以創(chuàng)建時長對象:

of() 通過指定的值來創(chuàng)建;

parse() 通過解析字符串來創(chuàng)建;

between() 通過兩個時間點來創(chuàng)建。

下面是幾個例子:

Duration duration1 = Duration.between(Instant.EPOCH, Instant.now());
Duration duration2 = Duration.between(LocalTime.parse("00:00:01"), LocalTime.now());
Period period1 = Period.parse("P1Y2M3D");  // 表示一年兩個月零三天
Period period2 = Period.of(1, 2, 3);       // 同上

注意時長可以為負數(shù)。

之前說過,一個 Instant 加上一個時長可以得到另一個 Instant。下面是個例子:

Instant then = Instant.now().plus(period);
? 時長的操作

時長與時長可以加減。例如 Period period2 = period1.plus(Period.ofDays(1)); 表示 period1 加上一天。

一個時間點加上一個時長可以得到另一個時間點。例如 LocalDateTime time = LocalDateTime.now().plus(period);。

? 時長的單位

這里必須注意的一點是,DurationPeriod 的值不是單個數(shù)字,而是多個單位的組合,像 Period 是年月日的組合,比如 “1年零3個月零5天”,你不能把它看作是 (1 x 365 + 3 x 30 + 5) 天,因為這里可能有閏年和非閏年的區(qū)別。所以 Period.ofYears(1) 是無法轉(zhuǎn)換為天數(shù)的。

四、時間單位轉(zhuǎn)換

當(dāng)我們要具體計算兩個時間點之間的秒數(shù)或天數(shù),該怎么辦呢?這里有一個叫 ChronoUnit 的類。下面是幾個例子:

// 離那個什么中華民族的偉大復(fù)興還有多少天
long days = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.of(2049, 10, 1));

其實 Java 8 的這套時間 API 比之前的 Date 和 Calendar 都要好懂得多,稍微練習(xí)一下就可以運用自如。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68665.html

相關(guān)文章

  • Spring Framework 參考文檔(概述)

    摘要:除此之外,還為不同的應(yīng)用程序體系結(jié)構(gòu)提供了基礎(chǔ)支持,包括消息傳遞事務(wù)數(shù)據(jù)和持久性以及,它還包括基于的框架,以及與之并行的反應(yīng)性框架。還支持依賴項注入和公共注解規(guī)范,應(yīng)用程序開發(fā)人員可以選擇使用這些規(guī)范,而不是提供的特定于的機制。 概述 Spring使創(chuàng)建Java企業(yè)應(yīng)用程序變得很容易,它提供了在企業(yè)環(huán)境中使用Java語言所需要的一切,支持Groovy和Kotlin作為JVM上的替代語言...

    silencezwm 評論0 收藏0
  • Android程序員完全沒時間提升自己怎么辦?

    摘要:昨天有個小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點后悔選擇開發(fā)了,月月光不說,還加班特別嚴重,平時也沒有屬于自己的時間去學(xué)習(xí),問我剛畢業(yè)的時候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時間提升自己的技術(shù)。 昨天有個小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點后悔選擇Android開發(fā)了,月月光不說...

    kohoh_ 評論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(二)

    摘要:響應(yīng)式編程是基于異步和事件驅(qū)動的非阻塞程序,只是垂直通過在內(nèi)啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...

    gaara 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<