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

Java8新特性之新日期時(shí)間庫的使用教程

 更新時(shí)間:2020年12月15日 14:51:32   作者:拼搏吧,少年  
這篇文章主要給大家介紹了關(guān)于Java8新特性之新日期時(shí)間庫使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、為什么引入新的日期時(shí)間庫

Java對(duì)日期,日歷及時(shí)間的處理一直以來都飽受詬病,尤其是它決定將java.util.Date定義為可修改的以及將SimpleDateFormat實(shí)現(xiàn)成非線程安全的。

關(guān)于這個(gè)新的時(shí)間日期庫的最大的優(yōu)點(diǎn)就在于它定義清楚了時(shí)間日期相關(guān)的一些概念,比方說,瞬時(shí)時(shí)間(Instant),持續(xù)時(shí)間(duration),日期(date),時(shí)間(time),時(shí)區(qū)(time-zone)以及時(shí)間段(Period)。同時(shí)它也借鑒了Joda庫的一些優(yōu)點(diǎn),比如將人和機(jī)器對(duì)時(shí)間日期的理解區(qū)分開的。Java 8仍然延用了ISO的日歷體系,并且與它的前輩們不同,java.time包中的類是不可變且線程安全的。

二、如何使用Java8的新日期和時(shí)間

首先認(rèn)識(shí)下Java8新日期和時(shí)間的一些關(guān)鍵類:

類名 說明
Instant 代表時(shí)間戳
LocalDate 不包含具體時(shí)間的日期
LocalTime 不包含日期的時(shí)間
LocalDateTime 包含了日期及時(shí)間,沒有時(shí)區(qū)信息
ZonedDateTime 包含時(shí)區(qū)的完整的日期時(shí)間,偏移量是以UTC/格林威治時(shí)間為基準(zhǔn)的
DateTimeFormatter 日期解析和格式化工具類

接下來從幾個(gè)示例中認(rèn)識(shí)Java8新日期和時(shí)間的特別之處,很強(qiáng)大

在Java8中獲取當(dāng)前日期

Java 8中有一個(gè)叫LocalDate的類,它能用來表示今天的日期。這個(gè)類與java.util.Date略有不同,因?yàn)樗话掌?,沒有時(shí)間。因此,如果你只需要表示日期而不包含時(shí)間,就可以使用它。

LocalDate today = LocalDate.now();
System.out.println("Today is : " + today);

輸出結(jié)果:

Today is : 2020-12-13

從輸出結(jié)果中可以看到,日期是格式化完了后再輸出來的,不像之前的Date類那樣,打印出來的數(shù)據(jù)都是未經(jīng)格式化的,不便于閱讀。

在Java8中獲取當(dāng)前的年月日

LocalDate類中提供了一些很方便的方法可以用于提取出年月日以及其它的日期屬性。使用這些方法,你可以獲取到任何你所需要的日期屬性,而不再需要使用java.util.Calendar這樣的類

LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d , Month : %d , day : %d \t %n", year, month, day);

輸出結(jié)果:

Year : 2020 , Month : 12 , day : 13

在Java8中獲取某個(gè)特定的日期

使用工廠方法LocalDate.of(),則可以創(chuàng)建出任意一個(gè)日期,它接受年月日的參數(shù),然后返回一個(gè)等價(jià)的LocalDate實(shí)例。關(guān)于這個(gè)方法還有一個(gè)好消息就是它沒有再犯之前API中的錯(cuò),比方說,年只能從1900年開始,月必須從0開始,等等。這里的日期你寫什么就是什么,比如說,下面這個(gè)例子中它代表的就是1月14日,沒有什么隱藏邏輯

LocalDate today = LocalDate.of(2020, 12, 13);
System.out.println("Today is : " + today);

輸出結(jié)果:

Today is : 2020-12-13

在Java8中檢查兩個(gè)日期是否相等

LocalDate重寫了equals方法來進(jìn)行日期的比較

LocalDate today = LocalDate.now();
LocalDate date = LocalDate.of(2014, 01, 14); 
if(date.equals(today)){ 
  System.out.printf("Today %s and date %s are same date %n", today, date); 
} 

輸出結(jié)果:

Today 2020-12-13 and date 2020-12-13 are same date

在Java8中檢查重復(fù)事件

使用MonthDay類。這個(gè)類由月日組合,不包含年信息,也就是說你可以用它來代表每年重復(fù)出現(xiàn)的一些日子。當(dāng)然也有一些別的組合,比如說YearMonth類。它和新的時(shí)間日期庫中的其它類一樣也都是不可變且線程安全的,并且它還是一個(gè)值類(value class)

LocalDate today = LocalDate.now();
LocalDate dateOfBirth = LocalDate.of(2020, 12, 13);
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if (currentMonthDay.equals(birthday)) {
System.out.println("Oh, today is your birthday");
} else {
System.out.println("Sorry, today is not your birthday");
}

輸出結(jié)果:

Oh, today is your birthday

在Java8中獲取當(dāng)前時(shí)間

使用LocalTime的類,它是沒有日期的時(shí)間,與LocalDate是近親。這里你也可以用靜態(tài)工廠方法now()來獲取當(dāng)前時(shí)間。默認(rèn)的格式是hh:mm:ss:nnn,這里的nnn是納秒

LocalTime time = LocalTime.now();
System.out.println("local time now : " + time);

輸出結(jié)果:

local time now : 13:44:48.255

在Java8中增加小時(shí)數(shù)

Java 8不僅提供了不可變且線程安全的類,它還提供了一些更方便的方法譬如plusHours()來替換原來的add()方法。順便說一下,這些方法返回的是一個(gè)新的LocalTime實(shí)例的引用,因?yàn)長(zhǎng)ocalTime是不可變的,可別忘了存儲(chǔ)好這個(gè)新的引用。

LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2);
System.out.println("Time after 2 hours : " + newTime);

輸出結(jié)果:

Time after 2 hours : 15:47:00.787

在Java8中獲取1周后的日期

LocalDate是用來表示無時(shí)間的日期的,它有一個(gè)plus()方法可以用來增加日,星期,或者月,ChronoUnit則用來表示這個(gè)時(shí)間單位。由于LocalDate也是不可變的,因此任何修改操作都會(huì)返回一個(gè)新的實(shí)例,因此別忘了保存起來。

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Today is : " + today);
System.out.println("Date after 1 week : " + nextWeek);

輸出結(jié)果:

Today is : 2020-12-13
Date after 1 week : 2020-12-20

在Java8中獲取一年前后的日期

使用LocalDate的plus()方法來給日期增加日,周或者月,現(xiàn)在我們來學(xué)習(xí)下如何用minus()方法來找出一年前的那天。

LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("Date before 1 year : " + previousYear);
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("Date after 1 year : " + nextYear);

輸出結(jié)果:

Date before 1 year : 2019-12-13
Date after 1 year : 2021-12-13

在Java8中使用時(shí)鐘

Java 8中自帶了一個(gè)Clock類,你可以用它來獲取某個(gè)時(shí)區(qū)下當(dāng)前的瞬時(shí)時(shí)間,日期或者時(shí)間??梢杂肅lock來替代System.currentTimeInMillis()與 TimeZone.getDefault()方法,如果你需要對(duì)不同時(shí)區(qū)的日期進(jìn)行處理的話這是相當(dāng)方便的。

// Returns the current time based on your system clock and set to UTC.
Clock clock1 = Clock.systemUTC();
System.out.println("Clock : " + LocalDate.now(clock1));

// Returns time based on system clock zone Clock defaultClock = 
Clock clock2 = Clock.systemDefaultZone();
System.out.println("Clock : " + LocalDate.now(clock2));

輸出結(jié)果:

Clock : 2020-12-13
Clock : 2020-12-13

在Java8中判斷一個(gè)日期在某個(gè)日期的前后

在Java 8中,LocalDate類有一個(gè)isBefore()和isAfter()方法可以用來比較兩個(gè)日期。如果調(diào)用方法的那個(gè)日期比給定的日期要早的話,isBefore()方法會(huì)返回true。

LocalDate today = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2020, 12, 14);
if (tomorrow.isAfter(today)) {
  System.out.println("Tomorrow comes after today");
}
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
if (yesterday.isBefore(today)) {
  System.out.println("Yesterday is day before today");
}

輸出結(jié)果:

Tomorrow comes after today
Yesterday is day before today

在Java8中處理不同的時(shí)區(qū)

Java 8不僅將日期和時(shí)間進(jìn)行了分離,同時(shí)還有時(shí)區(qū)?,F(xiàn)在已經(jīng)有好幾組與時(shí)區(qū)相關(guān)的類了,比如ZonId代表的是某個(gè)特定的時(shí)區(qū),而ZonedDateTime代表的是帶時(shí)區(qū)的時(shí)間。

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localDateTime, ZoneId.of("America/New_York"));
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);

輸出結(jié)果:

Current date and time in a particular timezone : 2020-12-13T14:40:44.664-05:00[America/New_York]

在Java8中表示固定的日期

YearMonth又是另一個(gè)組合,它代表的是像信用卡還款日,定期存款到期日,options到期日這類的日期。你可以用這個(gè)類來找出那個(gè)月有多少天,lengthOfMonth()這個(gè)方法返回的是這個(gè)YearMonth實(shí)例有多少天,這對(duì)于檢查2月到底是28天還是29天可是非常有用的。

YearMonth currentYearMonth = YearMonth.now();
System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2020, Month.FEBRUARY);
System.out.printf("Your credit card expires on %s %n", creditCardExpiry);

輸出結(jié)果:

Days in month year 2020-12: 31
Your credit card expires on 2020-02

在Java8中檢查閏年

LocalDate類有一個(gè)isLeapYear()的方法能夠返回當(dāng)前LocalDate對(duì)應(yīng)的那年是否是閏年。

LocalDate today = LocalDate.now();
if (today.isLeapYear()) {
System.out.println("This year is Leap year");
} else {
System.out.println("2020 is not a Leap year");
}

輸出結(jié)果:

This year is Leap year

在Java8中判斷兩個(gè)日期之間包含多少天/月

一個(gè)常見的任務(wù)就是計(jì)算兩個(gè)給定的日期之間包含多少天,多少周或者多少年。你可以用java.time.Period類來完成這個(gè)功能。

LocalDate today = LocalDate.now();
LocalDate java8Release = LocalDate.of(2021, Month.JANUARY, 13);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("Months left between today and Java 8 release : " + periodToNextJavaRelease.getMonths());

輸出結(jié)果:

Months left between today and Java 8 release : 1

在Java8中獲取當(dāng)前時(shí)間戳

Instant類有一個(gè)靜態(tài)的工廠方法now()可以返回當(dāng)前時(shí)間戳

Instant timestamp = Instant.now();
System.out.println("instant : " + timestamp);

輸出結(jié)果:

instant : 2020-12-13T07:30:55.877Z

在Java8中使用預(yù)定義的格式器來對(duì)日期進(jìn)行解析/格式化

在Java 8之前,時(shí)間日期的格式化可是個(gè)技術(shù)活,我們的好伙伴SimpleDateFormat并不是線程安全的,而如果用作本地變量來格式化的話又顯得有些笨重。多虧了線程本地變量,這使得它在多線程環(huán)境下也算有了用武之地。這次它引入了一個(gè)全新的線程安全的日期與時(shí)間格式器。它還自帶了一些預(yù)定義好的格式器,包含了常用的日期格式。

String date = "20201213";
LocalDate formatted = LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", date, formatted);

輸出結(jié)果:

Date generated from String 20201213 is 2020-12-13

在Java8中使用自定義的格式器來解析日期

在DateTimeFormatter的ofPattern靜態(tài)方法()傳入任何的模式,它會(huì)返回一個(gè)實(shí)例,這個(gè)模式的字面量與前例中是相同的。比如說M還是代表月,而m仍是分。無效的模式會(huì)拋出DateTimeParseException異常

String goodFriday = "12 13 2020";
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");
LocalDate holiday = LocalDate.parse(goodFriday, formatter);
System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday);
} catch (DateTimeParseException ex) {
ex.printStackTrace();
}

輸出結(jié)果:

Successfully parsed String 12 13 2020, date is 2020-12-13

在Java8中對(duì)日期進(jìn)行格式化,轉(zhuǎn)換成字符串

使用DateTimeFormatter類的實(shí)例,調(diào)用它的format()方法。這個(gè)方法會(huì)返回一個(gè)代表當(dāng)前日期的字符串,對(duì)應(yīng)的模式就是傳入的DateTimeFormatter實(shí)例中所定義好的。

LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a");
String landing = localDateTime.format(format);
System.out.printf("Arriving at : %s %n", landing);

輸出結(jié)果:

Arriving at : 十二月 13 2020 04:13 下午

三、總結(jié)

  • Java 8中新的時(shí)間與日期API中的所有類都是不可變且線程安全的,這與之前的Date與Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat這些關(guān)鍵的類都不是線程安全的。
  • 新的時(shí)間與日期API中很重要的一點(diǎn)是它定義清楚了基本的時(shí)間與日期的概念,比方說,瞬時(shí)時(shí)間,持續(xù)時(shí)間,日期,時(shí)間,時(shí)區(qū)以及時(shí)間段。它們都是基于ISO日歷體系的。
  • Java8新的API能勝任任何與時(shí)間日期相關(guān)的任務(wù)。

到此這篇關(guān)于Java8新特性之新日期時(shí)間庫使用的文章就介紹到這了,更多相關(guān)Java8新日期時(shí)間庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中File文件操作類的基礎(chǔ)用法

    Java中File文件操作類的基礎(chǔ)用法

    這篇文章主要給大家介紹了關(guān)于Java中File文件操作類基礎(chǔ)用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用File類具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • java中hibernate二級(jí)緩存詳解

    java中hibernate二級(jí)緩存詳解

    本篇文章中主要介紹了java中hibernate二級(jí)緩存詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 如何修改HttpServletRequest中header中的信息

    如何修改HttpServletRequest中header中的信息

    這篇文章主要介紹了如何修改HttpServletRequest中header中的信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解決idea services窗口不見的一種特殊情況(小白采坑系列)

    解決idea services窗口不見的一種特殊情況(小白采坑系列)

    這篇文章主要介紹了解決idea services窗口不見的一種特殊情況(小白采坑系列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • mybatis中如何用tinyint保存Boolean類型

    mybatis中如何用tinyint保存Boolean類型

    這篇文章主要介紹了mybatis中如何用tinyint保存Boolean類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 淺析Spring?中?Bean?的理解與使用

    淺析Spring?中?Bean?的理解與使用

    這篇文章主要介紹了Spring?中?Bean?的理解與使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Thread.sleep(0)的寫法原理深入解析

    Thread.sleep(0)的寫法原理深入解析

    這篇文章主要為大家介紹了Thread.sleep(0)的寫法原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 如何通過jstack命令dump線程信息

    如何通過jstack命令dump線程信息

    這篇文章主要介紹了如何通過jstack命令dump線程信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java的Junit測(cè)試框架中的其他注解說明

    Java的Junit測(cè)試框架中的其他注解說明

    這篇文章主要介紹了Java的Junit測(cè)試框架中的其他注解說明,JUnit是一個(gè)開源的java單元測(cè)試框架,它是XUnit測(cè)試體系架架構(gòu)的一種體現(xiàn),
    是Java語言事實(shí)上的標(biāo)準(zhǔn)單元測(cè)試庫,需要的朋友可以參考下
    2023-10-10
  • SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書的增刪改查功能示例

    SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書的增刪改查功能示例

    本文主要介紹了SpringBoot+Vue+Axios+BootStrap實(shí)現(xiàn)圖書的增刪改查功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論

宣威市| 永安市| 芜湖县| 仁化县| 嘉黎县| 吉林省| 合阳县| 延长县| 新干县| 东明县| 鱼台县| 淄博市| 武清区| 隆昌县| 奇台县| 安顺市| 舟曲县| 灌云县| 黎川县| 拉萨市| 高尔夫| 迁西县| 嫩江县| 新宾| 灌南县| 密山市| 岱山县| 古田县| 阳江市| 渑池县| 沂南县| 高清| 河源市| 日照市| 探索| 恩施市| 沁源县| 囊谦县| 穆棱市| 图木舒克市| 南华县|