掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Java 8目前已經(jīng)開始進(jìn)入大眾的視線,其中筆者在寫本文之前,留意到其中Java 8預(yù)覽版中將會出現(xiàn)新的關(guān)于日期和時(shí)間的API(遵守JSR 310規(guī)范)。在本系列文章中,將對這些新的API進(jìn)行舉例說明。首先在本文中,將先介紹以下幾個(gè):Instant,LocalDate,LocalTime和LocalDateTime。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)吳興免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
- Instant (java.time.Instant)
可能最容易開始學(xué)習(xí)java.time包中的內(nèi)容的就是先來看看Instant這個(gè)類。所謂的Instant類代表的是某個(gè)時(shí)間(有點(diǎn)象java.util.Date),它是精確到納秒的(而不是象舊版本的Date精確到毫秒)。如果使用納秒去表示一個(gè)時(shí)間則原來的使用一位Long類型是不足夠的,需要占用更多一點(diǎn)的存儲空間,然而實(shí)際上其內(nèi)部是由兩個(gè)Long字段組成,***個(gè)部分保存的是自標(biāo)準(zhǔn)Java計(jì)算時(shí)代(就是1970年1月1日開始)到現(xiàn)在的秒數(shù),第二部分保存的是納秒數(shù)(永遠(yuǎn)不會超過999,999,999)。我們看下一個(gè)具體的例子:
- //獲得當(dāng)前時(shí)間
- //獲得當(dāng)前時(shí)間
- Instant instant = Instant.now();
- // 以ISO-8601輸出
- System.out.println(instant);
在Open JDK 中運(yùn)行上面的代碼,可以有如下格式的輸出:2013-06-25T16:22:52.966Z,可以看到,輸入了更為精確的日期。下面的例子是更多的關(guān)于Instant類的用法,如
- //將java.util.Date轉(zhuǎn)換為Instant
- Instant instant = Instant.ofEpochMilli(new Date().getTime());
- //從字符串類型中創(chuàng)建Instant類型的時(shí)間
- instant = Instant.parse("1995-10-23T10:12:35Z");
注意,在上面的例子中,有一個(gè)字符串中創(chuàng)建Instant類型的時(shí)間,但I(xiàn)nstant代表的是一個(gè)時(shí)間,并不包括時(shí)區(qū)的概念,所以必須傳入的是符合UTC格式的字符串)。Instant API也提供了一些很有用的方法允許使用Instant和其他包中的類進(jìn)行一些運(yùn)算,下面是例子:
- instant.plus(Duration.ofHours(5).plusMinutes(4));
上面表達(dá)的含義為,將現(xiàn)在的時(shí)間加上5個(gè)小時(shí)4分鐘。
那么這個(gè)例子中,使用了多少個(gè)java.time.Instant實(shí)例呢?答案是兩個(gè)。Java.time這個(gè)包是線程安全的并且和其他大部分類一樣是不可變類。Instant也遵守這個(gè)規(guī)則,因此plus方法產(chǎn)生一個(gè)新的實(shí)例,如:
- Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4));
- System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1));
輸出為:
- Instant is immutable, so instant==instant returns: false
下面是更多關(guān)于計(jì)算的例子:
- // Substract 5 days of an instant 計(jì)算5天前
- instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1
- instant.minus(Duration.ofDays(5)); // Option 2 方法2
- //計(jì)算兩個(gè)Instant之間的分鐘數(shù)
- long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1
- long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2
Instant是可比較的,這意味著可以對兩個(gè)Instant進(jìn)行比較。它提供了isAfter()和isBefore()兩個(gè)方法進(jìn)行比較,如下代碼所示:
- //用compareTo方法比較
- System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant));
- // 使用isAfter()和isBefore()
- System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n",
- instant1.isAfter(instant), instant1.isBefore(instant))
輸出結(jié)果:
- instant1.compareTo(instant)=1.
- instant1.isAfter(instant)=true, instant1.isBefore(instant)=false
Localdate和LocalTime
LocalDate表示不帶時(shí)區(qū)的日期,比如1-1-2000。LocalTime表示不帶時(shí)區(qū)的時(shí)間,比如04:44:50.12,和之前提到的Instant類是從1970年計(jì)算偏移量不同,這兩個(gè)類的輸出是人們習(xí)慣閱讀的日期和時(shí)間。有很多種方法去獲得LocalTime和LocalDate的實(shí)例,如
- LocalDate localDate = LocalDate.now();
- localDate = LocalDate.ofYearDay(2005, 86); // 獲得2005年的第86天 (27-Mar-2005)
- localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013年8月10日
- LocalTime localTime = LocalTime.of(22, 33); //10:33 PM
- localTime = LocalTime.now();
- localTime = LocalTime.ofSecondOfDay(4503); // 返回一天中的第4503秒 (1:15:30 AM)
LocalDate和LocalTime和Instant一樣遵守同樣的線程規(guī)定―― 如它們的實(shí)例子都是不可變的。LocalDate和LocalTime和Instant有同樣的計(jì)算和比較方法(其中有些方法是在java.time.temporal.Temporal接口中定義的,并且上面這些類都實(shí)現(xiàn)了這些方法):
- LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS);
- localDate.isBefore(localDate1);
LocalDateTime
***來看下在簡單日期和時(shí)間類中最重要的一個(gè):LocalDataTeime。它是LocalDate和LocalTime的組合體,表示的是不帶時(shí)區(qū)的日期及時(shí)間??瓷先ィ琇ocalDateTime和Instant很象,但記得的是“Instant中是不帶時(shí)區(qū)的即時(shí)時(shí)間點(diǎn)??赡苡腥苏f,即時(shí)的時(shí)間點(diǎn)不就是日期+時(shí)間么?看上去是這樣的,但還是有所區(qū)別,比如LocalDateTime對于用戶來說,可能就只是一個(gè)簡單的日期和時(shí)間的概念,考慮如下的例子:兩個(gè)人都在2013年7月2日11點(diǎn)出生,***個(gè)人是在英國出生,而第二個(gè)是在加尼福利亞,如果我們問他們是在什么時(shí)候出生的話,則他們看上去都是在同樣的時(shí)間出生(就是LocalDateTime所表達(dá)的),但如果我們根據(jù)時(shí)間線(如格林威治時(shí)間線)去仔細(xì)考察,則會發(fā)現(xiàn)在出生的人會比在英國出生的人稍微晚幾個(gè)小時(shí)(這就是Instant所表達(dá)的概念,并且要將其轉(zhuǎn)換為UTC格式的時(shí)間)。除此之外,LocalDateTime的用法和上述介紹的其他類都很相似,如下例子所示:
- LocalDateTime localDateTime = LocalDateTime.now();
- //當(dāng)前時(shí)間加上25小時(shí)3分鐘
- LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3);
- // 同樣也可以用在localTime和localDate中
- System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3));
- System.out.println(localDateTime.toLocalDate().plusMonths(2));
- // 也可以使用實(shí)現(xiàn)TemportalAmount接口的Duration類和Period類
- System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3)));
- System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2)));

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流