摘要:的操作加減相互比較獲得時(shí)間差。表示一天當(dāng)中的時(shí)間,其精確度到納秒。既包含日期也包含時(shí)間,但是不包含時(shí)區(qū)。此外一個(gè)對(duì)象和一個(gè)對(duì)象可以組合為一個(gè)對(duì)象。表示以天為單位的時(shí)長(zhǎng),精確到天。
Java 8 出來(lái)很久了,各位也可能已經(jīng)在用了,不過(guò)其中新的時(shí)間日期 API 可能很少人用,甚至不知道怎么上手。本文快速介紹一下其中的主要的類的概念和用法。
一、時(shí)間戳 InstantInstant 表示一個(gè) EPOCH 時(shí)間戳(即以 0 表示 1970-01-01T00:00:00Z),精確到納秒。Instant 對(duì)象不包含時(shí)區(qū)信息,且值是不可變的。
雖然概念很簡(jiǎn)單,但是它可以很方便的和其他時(shí)間日期對(duì)象之間進(jìn)行交互和轉(zhuǎn)換。比如:
兩個(gè) Instant 可以用來(lái)構(gòu)建一個(gè)時(shí)間段;
一個(gè) Instant 加上一個(gè)時(shí)長(zhǎng)可以得到另一個(gè) Instant;
一個(gè) Instant 加上一個(gè)時(shí)區(qū)可以得到一個(gè) ZonedDateTime 對(duì)象。
? 創(chuàng)建 Instant首先 Instant 有下面幾個(gè)常量:
Instant.EPOCH 表示 1970-01-01T00:00:00Z
Instant.MIN 表示 Instant 可度量的最早時(shí)間,公元前十億年
Instant.MAX 表示 Instant 可度量的最晚時(shí)間,公元十億年
我們也可以通過(guò)一些靜態(tài)方法來(lái)創(chuàng)建:
Instant.now() 表示當(dāng)前時(shí)間戳
Instant.ofEpochMilli(long milliSec) 通過(guò)現(xiàn)有的毫秒時(shí)間戳來(lái)創(chuàng)建 Instant 對(duì)象
Instant.ofEpochSecond(long seconds) 通過(guò)現(xiàn)有的秒時(shí)間戳來(lái)創(chuàng)建 Instant 對(duì)象
? 從 Instant 取值Instant 對(duì)象包含兩個(gè)值:秒數(shù)和納秒數(shù)。其中秒數(shù)指的是 epoch 時(shí)間戳,而納秒數(shù)指的是該秒內(nèi)的納秒時(shí)間。由此可知,Instant 對(duì)象的精確度比 System.currentTimeMillis() 高到不知道哪去了。
所以從 Instant 可以取到兩個(gè)值:Instant.getEpochSecond() 獲取秒數(shù)部分,Instant.getNano() 獲取納秒部分。
? Instant 的操作加減:plus(), minus();
相互比較:isAfter(), isBefore();
獲得時(shí)間差:until()。
下面是幾個(gè)例子:
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)換成完整的時(shí)間
這部分將在后面介紹。
二、本地日期 / 本地時(shí)間 / 本地日期時(shí)間LocalDate 表示年月日,其精確度到天。它是不包含時(shí)分秒的。
LocalTime 表示一天當(dāng)中的時(shí)間,其精確度到納秒。它是不包含年月日的。
LocalDateTime 既包含日期也包含時(shí)間,但是不包含時(shí)區(qū)。它實(shí)際上就是 LocalDate 和 LocalTime 的組合。
? 創(chuàng)建 LocalDate/LocalTime/LocalDateTime 對(duì)象這三個(gè)類都有下面的幾個(gè)靜態(tài)方法來(lái)創(chuàng)建對(duì)象:
now() 表示當(dāng)前時(shí)間或日期的對(duì)象;
of() 使用指定的值來(lái)創(chuàng)建;
parse() 通過(guò)解析字符串來(lái)創(chuàng)建。
此外一個(gè) LocalDate 對(duì)象和一個(gè) LocalTime 對(duì)象可以組合為一個(gè) LocalDateTime 對(duì)象。
下面是幾個(gè)例子:
LocalTime localTime = LocalTime.now(); LocalDate localDate = LocalDate.of(2018, 3, 5); LocalDateTime localDateTime = LocalDateTime.parse("2018-03-05T12:34:56"); // 下面兩句是等價(jià)的 LocalDateTime localDateTime1 = localDate.atTime(localTime); LocalDateTime localDateTime2 = localTime.atDate(localDate);
此外它們還有各自的創(chuàng)建對(duì)象的靜態(tài)方法,具體請(qǐng)參考 API 文檔。
到了這里你可能發(fā)現(xiàn) LocalDateTime 和 Instance 本質(zhì)上是一樣的,都表示一個(gè)全局跨度內(nèi)的一個(gè)時(shí)間點(diǎn)。那么兩者是否可以互換呢?很可惜,不能直接互換。
因?yàn)?LocalDateTime 沒(méi)有帶時(shí)區(qū),而 Instance 的時(shí)間戳是統(tǒng)一以格林尼治時(shí)間為準(zhǔn)的,所以相同的 LocalDateTime 在不同時(shí)區(qū)的 EPOCH 時(shí)間戳不同,轉(zhuǎn)換的時(shí)候必須附加一個(gè)時(shí)區(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());三、時(shí)長(zhǎng) Duration/Period
Duration 表示以秒為單位的時(shí)長(zhǎng),精確到納秒。Period 表示以天為單位的時(shí)長(zhǎng),精確到天。
? 創(chuàng)建 Duration/Period有三類方法可以創(chuàng)建時(shí)長(zhǎng)對(duì)象:
of() 通過(guò)指定的值來(lái)創(chuàng)建;
parse() 通過(guò)解析字符串來(lái)創(chuàng)建;
between() 通過(guò)兩個(gè)時(shí)間點(diǎn)來(lái)創(chuàng)建。
下面是幾個(gè)例子:
Duration duration1 = Duration.between(Instant.EPOCH, Instant.now()); Duration duration2 = Duration.between(LocalTime.parse("00:00:01"), LocalTime.now()); Period period1 = Period.parse("P1Y2M3D"); // 表示一年兩個(gè)月零三天 Period period2 = Period.of(1, 2, 3); // 同上
注意時(shí)長(zhǎng)可以為負(fù)數(shù)。
之前說(shuō)過(guò),一個(gè) Instant 加上一個(gè)時(shí)長(zhǎng)可以得到另一個(gè) Instant。下面是個(gè)例子:
Instant then = Instant.now().plus(period);? 時(shí)長(zhǎng)的操作
時(shí)長(zhǎng)與時(shí)長(zhǎng)可以加減。例如 Period period2 = period1.plus(Period.ofDays(1)); 表示 period1 加上一天。
一個(gè)時(shí)間點(diǎn)加上一個(gè)時(shí)長(zhǎng)可以得到另一個(gè)時(shí)間點(diǎn)。例如 LocalDateTime time = LocalDateTime.now().plus(period);。
? 時(shí)長(zhǎng)的單位這里必須注意的一點(diǎn)是,Duration 和 Period 的值不是單個(gè)數(shù)字,而是多個(gè)單位的組合,像 Period 是年月日的組合,比如 “1年零3個(gè)月零5天”,你不能把它看作是 (1 x 365 + 3 x 30 + 5) 天,因?yàn)檫@里可能有閏年和非閏年的區(qū)別。所以 Period.ofYears(1) 是無(wú)法轉(zhuǎn)換為天數(shù)的。
四、時(shí)間單位轉(zhuǎn)換當(dāng)我們要具體計(jì)算兩個(gè)時(shí)間點(diǎn)之間的秒數(shù)或天數(shù),該怎么辦呢?這里有一個(gè)叫 ChronoUnit 的類。下面是幾個(gè)例子:
// 離那個(gè)什么中華民族的偉大復(fù)興還有多少天 long days = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.of(2049, 10, 1));
其實(shí) Java 8 的這套時(shí)間 API 比之前的 Date 和 Calendar 都要好懂得多,稍微練習(xí)一下就可以運(yùn)用自如。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68665.html
摘要:除此之外,還為不同的應(yīng)用程序體系結(jié)構(gòu)提供了基礎(chǔ)支持,包括消息傳遞事務(wù)數(shù)據(jù)和持久性以及,它還包括基于的框架,以及與之并行的反應(yīng)性框架。還支持依賴項(xiàng)注入和公共注解規(guī)范,應(yīng)用程序開發(fā)人員可以選擇使用這些規(guī)范,而不是提供的特定于的機(jī)制。 概述 Spring使創(chuàng)建Java企業(yè)應(yīng)用程序變得很容易,它提供了在企業(yè)環(huán)境中使用Java語(yǔ)言所需要的一切,支持Groovy和Kotlin作為JVM上的替代語(yǔ)言...
摘要:昨天有個(gè)小學(xué)弟給我發(fā)來(lái)微信,說(shuō)他現(xiàn)在有點(diǎn)后悔選擇開發(fā)了,月月光不說(shuō),還加班特別嚴(yán)重,平時(shí)也沒(méi)有屬于自己的時(shí)間去學(xué)習(xí),問(wèn)我剛畢業(yè)的時(shí)候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒(méi)有其他時(shí)間提升自己的技術(shù)。 昨天有個(gè)小學(xué)弟給我發(fā)來(lái)微信,說(shuō)他現(xiàn)在有點(diǎn)后悔選擇Android開發(fā)了,月月光不說(shuō)...
摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過(guò)在內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對(duì)日志消息測(cè)試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實(shí)踐 文章工程: JDK...
閱讀 1778·2021-11-15 11:37
閱讀 3048·2021-11-04 16:05
閱讀 1918·2021-10-27 14:18
閱讀 2749·2021-08-12 13:30
閱讀 2494·2019-08-29 14:18
閱讀 2081·2019-08-29 13:07
閱讀 2018·2019-08-27 10:54
閱讀 2719·2019-08-26 12:15