摘要:的操作加減相互比較獲得時間差。表示一天當(dāng)中的時間,其精確度到納秒。既包含日期也包含時間,但是不包含時區(qū)。此外一個對象和一個對象可以組合為一個對象。表示以天為單位的時長,精確到天。
Java 8 出來很久了,各位也可能已經(jīng)在用了,不過其中新的時間日期 API 可能很少人用,甚至不知道怎么上手。本文快速介紹一下其中的主要的類的概念和用法。
一、時間戳 InstantInstant 表示一個 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 表示一天當(dāng)中的時間,其精確度到納秒。它是不包含年月日的。
LocalDateTime 既包含日期也包含時間,但是不包含時區(qū)。它實際上就是 LocalDate 和 LocalTime 的組合。
? 創(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) LocalDateTime 和 Instance 本質(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);。
? 時長的單位這里必須注意的一點是,Duration 和 Period 的值不是單個數(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
摘要:除此之外,還為不同的應(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上的替代語言...
摘要:昨天有個小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點后悔選擇開發(fā)了,月月光不說,還加班特別嚴重,平時也沒有屬于自己的時間去學(xué)習(xí),問我剛畢業(yè)的時候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時間提升自己的技術(shù)。 昨天有個小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點后悔選擇Android開發(fā)了,月月光不說...
摘要:響應(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...
閱讀 1880·2021-11-15 11:37
閱讀 3240·2021-11-04 16:05
閱讀 2026·2021-10-27 14:18
閱讀 2857·2021-08-12 13:30
閱讀 2561·2019-08-29 14:18
閱讀 2173·2019-08-29 13:07
閱讀 2141·2019-08-27 10:54
閱讀 2818·2019-08-26 12:15