国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

20 個案例教你在 Java 8 中如何處理日期和時間?

Rango / 1226人閱讀

摘要:前言前面一篇文章寫了如何安全的使用里面介紹了如何處理日期時間,以及如何保證線程安全,及其介紹了在中的處理時間日期默認(rèn)就線程安全的類。引入了全新的日期時間格式工具,線程安全而且使用方便。

前言

前面一篇文章寫了《SimpleDateFormat 如何安全的使用?》, 里面介紹了 SimpleDateFormat 如何處理日期/時間,以及如何保證線程安全,及其介紹了在 Java 8 中的處理時間/日期默認(rèn)就線程安全的 DateTimeFormatter 類。那么 Java 8 中該怎么樣處理生活中常見的一些日期/時間呢?比如:計算一周后的日期;計算一年前或一年后的日期;檢查閏年等。

接下來創(chuàng)建了 20 個基于任務(wù)的實例來學(xué)習(xí) Java 8 的新特性。從最簡單創(chuàng)建當(dāng)天的日期開始,然后創(chuàng)建時間及時區(qū),接著模擬一個日期提醒應(yīng)用中的任務(wù)——計算重要日期的到期天數(shù),例如生日、紀(jì)念日、賬單日、保費到期日、信用卡過期日等。

示例 1、在 Java 8 中獲取今天的日期

Java 8 中的 LocalDate 用于表示當(dāng)天日期。和 java.util.Date 不同,它只有日期,不包含時間。當(dāng)你僅需要表示日期時就用這個類。

1LocalDate now = LocalDate.now();
2System.out.println(now);

結(jié)果是:

12018-06-20

上面的代碼創(chuàng)建了當(dāng)天的日期,不含時間信息。打印出的日期格式非常友好,不像老的 Date 類打印出一堆沒有格式化的信息。

示例 2、在 Java 8 中獲取年、月、日信息

LocalDate 類提供了獲取年、月、日的快捷方法,其實例還包含很多其它的日期屬性。通過調(diào)用這些方法就可以很方便的得到需要的日期信息,不用像以前一樣需要依賴 java.util.Calendar 類了

1LocalDate now = LocalDate.now();
2int year = now.getYear();
3int monthValue = now.getMonthValue();
4int dayOfMonth = now.getDayOfMonth();
5System.out.printf("year = %d, month = %d, day = %d", year, monthValue, dayOfMonth);

結(jié)果是:

1year = 2018, month = 6, day = 20
示例 3、在 Java 8 中處理特定日期

在第一個例子里,我們通過靜態(tài)工廠方法 now() 非常容易地創(chuàng)建了當(dāng)天日期,你還可以調(diào)用另一個有用的工廠方法LocalDate.of() 創(chuàng)建任意日期, 該方法需要傳入年、月、日做參數(shù),返回對應(yīng)的 LocalDate 實例。這個方法的好處是沒再犯老 API 的設(shè)計錯誤,比如年度起始于 1900,月份是從 0 開始等等。日期所見即所得,就像下面這個例子表示了 6 月 20 日,沒有任何隱藏機(jī)關(guān)。

1LocalDate date = LocalDate.of(2018, 06, 20);
2System.out.println(date);

可以看到創(chuàng)建的日期完全符合預(yù)期,與寫入的 2018 年 6 月 20 日完全一致。

示例 4、在 Java 8 中判斷兩個日期是否相等

現(xiàn)實生活中有一類時間處理就是判斷兩個日期是否相等。你常常會檢查今天是不是個特殊的日子,比如生日、紀(jì)念日或非交易日。這時就需要把指定的日期與某個特定日期做比較,例如判斷這一天是否是假期。下面這個例子會幫助你用 Java 8 的方式去解決,你肯定已經(jīng)想到了,LocalDate 重載了 equal 方法,請看下面的例子:

1LocalDate now = LocalDate.now();
2LocalDate date = LocalDate.of(2018, 06, 20);
3if (date.equals(now)) {
4    System.out.println("同一天");
5}

這個例子中我們比較的兩個日期相同。注意,如果比較的日期是字符型的,需要先解析成日期對象再作判斷。

示例 5、在 Java 8 中檢查像生日這種周期性事件

Java 中另一個日期時間的處理就是檢查類似每月賬單、結(jié)婚紀(jì)念日、EMI日或保險繳費日這些周期性事件。如果你在電子商務(wù)網(wǎng)站工作,那么一定會有一個模塊用來在圣誕節(jié)、感恩節(jié)這種節(jié)日時向客戶發(fā)送問候郵件。Java 中如何檢查這些節(jié)日或其它周期性事件呢?答案就是 MonthDay 類。這個類組合了月份和日,去掉了年,這意味著你可以用它判斷每年都會發(fā)生事件。和這個類相似的還有一個 YearMonth 類。這些類也都是不可變并且線程安全的值類型。下面我們通過 MonthDay 來檢查周期性事件:

1LocalDate now = LocalDate.now();
2LocalDate dateOfBirth = LocalDate.of(2018, 06, 20);
3MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
4MonthDay currentMonthDay = MonthDay.from(now);
5if (currentMonthDay.equals(birthday)) {
6    System.out.println("Happy Birthday");
7} else {
8    System.out.println("Sorry, today is not your birthday");
9}

結(jié)果:(注意:獲取當(dāng)前時間可能與你看的時候不對,所以這個結(jié)果可能和你看的時候運行結(jié)果不一樣)

1Happy Birthday

只要當(dāng)天的日期和生日匹配,無論是哪一年都會打印出祝賀信息。你可以把程序整合進(jìn)系統(tǒng)時鐘,看看生日時是否會受到提醒,或者寫一個單元測試來檢測代碼是否運行正確。

示例 6、在 Java 8 中獲取當(dāng)前時間

與 Java 8 獲取日期的例子很像,獲取時間使用的是 LocalTime 類,一個只有時間沒有日期的 LocalDate 近親。可以調(diào)用靜態(tài)工廠方法 now() 來獲取當(dāng)前時間。默認(rèn)的格式是 hh:mm:ss:nnn。

1LocalTime localTime = LocalTime.now();
2System.out.println(localTime);

結(jié)果:

113:35:56.155

可以看到當(dāng)前時間就只包含時間信息,沒有日期。

示例 7、如何在現(xiàn)有的時間上增加小時

通過增加小時、分、秒來計算將來的時間很常見。Java 8 除了不變類型和線程安全的好處之外,還提供了更好的plusHours() 方法替換 add(),并且是兼容的。注意,這些方法返回一個全新的 LocalTime 實例,由于其不可變性,返回后一定要用變量賦值。

1LocalTime localTime = LocalTime.now();
2System.out.println(localTime);
3LocalTime localTime1 = localTime.plusHours(2);//增加2小時
4System.out.println(localTime1);

結(jié)果:

113:41:20.721
215:41:20.721

可以看到,新的時間在當(dāng)前時間 13:41:20.721 的基礎(chǔ)上增加了 2 個小時。

示例 8、如何計算一周后的日期

和上個例子計算兩小時以后的時間類似,這個例子會計算一周后的日期。LocalDate 日期不包含時間信息,它的 plus()方法用來增加天、周、月,ChronoUnit 類聲明了這些時間單位。由于 LocalDate 也是不變類型,返回后一定要用變量賦值。

1LocalDate now = LocalDate.now();
2LocalDate plusDate = now.plus(1, ChronoUnit.WEEKS);
3System.out.println(now);
4System.out.println(plusDate);

結(jié)果:

12018-06-20
22018-06-27

可以看到新日期離當(dāng)天日期是 7 天,也就是一周。你可以用同樣的方法增加 1 個月、1 年、1 小時、1 分鐘甚至一個世紀(jì),更多選項可以查看 Java 8 API 中的 ChronoUnit 類。

示例 9、計算一年前或一年后的日期

繼續(xù)上面的例子,上個例子中我們通過 LocalDate 的 plus() 方法增加天數(shù)、周數(shù)或月數(shù),這個例子我們利用 minus() 方法計算一年前的日期。

1LocalDate now = LocalDate.now();
2LocalDate minusDate = now.minus(1, ChronoUnit.YEARS);
3LocalDate plusDate1 = now.plus(1, ChronoUnit.YEARS);
4System.out.println(minusDate);
5System.out.println(plusDate1);

結(jié)果:

12017-06-20
22019-06-20
示例 10、使用 Java 8 的 Clock 時鐘類

Java 8 增加了一個 Clock 時鐘類用于獲取當(dāng)時的時間戳,或當(dāng)前時區(qū)下的日期時間信息。以前用到System.currentTimeInMillis() 和 TimeZone.getDefault() 的地方都可用 Clock 替換。

1Clock clock = Clock.systemUTC();
2Clock clock1 = Clock.systemDefaultZone();
3System.out.println(clock);
4System.out.println(clock1);

結(jié)果:

1SystemClock[Z]
2SystemClock[Asia/Shanghai]
示例 11、如何用 Java 判斷日期是早于還是晚于另一個日期

另一個工作中常見的操作就是如何判斷給定的一個日期是大于某天還是小于某天?在 Java 8 中,LocalDate 類有兩類方法 isBefore() 和 isAfter() 用于比較日期。調(diào)用 isBefore() 方法時,如果給定日期小于當(dāng)前日期則返回 true。

1 LocalDate tomorrow = LocalDate.of(2018,6,20);
2 if(tomorrow.isAfter(now)){
3     System.out.println("Tomorrow comes after today");
4 }
5 LocalDate yesterday = now.minus(1, ChronoUnit.DAYS);
6 if(yesterday.isBefore(now)){
7     System.out.println("Yesterday is day before today");
8 }

在 Java 8 中比較日期非常方便,不需要使用額外的 Calendar 類來做這些基礎(chǔ)工作了。

示例 12、在 Java 8 中處理時區(qū)

Java 8 不僅分離了日期和時間,也把時區(qū)分離出來了。現(xiàn)在有一系列多帶帶的類如 ZoneId 來處理特定時區(qū),ZoneDateTime 類來表示某時區(qū)下的時間。這在 Java 8 以前都是 GregorianCalendar 類來做的。

1ZoneId america = ZoneId.of("America/New_York");
2LocalDateTime localtDateAndTime = LocalDateTime.now();
3ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, america );
4System.out.println(dateAndTimeInNewYork);
示例 13、如何表示信用卡到期這類固定日期,答案就在 YearMonth

與 MonthDay 檢查重復(fù)事件的例子相似,YearMonth 是另一個組合類,用于表示信用卡到期日、FD 到期日、期貨期權(quán)到期日等。還可以用這個類得到 當(dāng)月共有多少天,YearMonth 實例的 lengthOfMonth() 方法可以返回當(dāng)月的天數(shù),在判斷 2 月有 28 天還是 29 天時非常有用。

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

結(jié)果:

1Days in month year 2018-06: 30
2Your credit card expires on 2018-02
示例 14、如何在 Java 8 中檢查閏年

LocalDate 類有一個很實用的方法 isLeapYear() 判斷該實例是否是一個閏年。

示例 15、計算兩個日期之間的天數(shù)和月數(shù)

有一個常見日期操作是計算兩個日期之間的天數(shù)、周數(shù)或月數(shù)。在 Java 8 中可以用 java.time.Period 類來做計算。下面這個例子中,我們計算了當(dāng)天和將來某一天之間的月數(shù)。

1LocalDate date = LocalDate.of(2019, Month.MARCH, 20);
2Period period = Period.between(now, date);
3System.out.println("離下個時間還有" + period.getMonths() + " 個月");
示例 16、包含時差信息的日期和時間

在 Java 8 中,ZoneOffset 類用來表示時區(qū),舉例來說印度與 GMT 或 UTC 標(biāo)準(zhǔn)時區(qū)相差 +05:30,可以通過ZoneOffset.of() 靜態(tài)方法來獲取對應(yīng)的時區(qū)。一旦得到了時差就可以通過傳入 LocalDateTime 和 ZoneOffset 來創(chuàng)建一個 OffSetDateTime 對象。

1LocalDateTime datetime = LocalDateTime.of(2014, Month.JANUARY, 14,19,30);
2ZoneOffset offset = ZoneOffset.of("+05:30");
3OffsetDateTime date = OffsetDateTime.of(datetime, offset);  
4System.out.println("Date and Time with timezone offset in Java : " + date);
示例 17、在 Java 8 中獲取當(dāng)前的時間戳

如果你還記得 Java 8 以前是如何獲得當(dāng)前時間戳,那么現(xiàn)在你終于解脫了。Instant 類有一個靜態(tài)工廠方法 now() 會返回當(dāng)前的時間戳,如下所示:

1Instant timestamp = Instant.now();
2System.out.println(timestamp);

結(jié)果:

12018-06-20T06:35:24.881Z

時間戳信息里同時包含了日期和時間,這和 java.util.Date 很像。實際上 Instant 類確實等同于 Java 8 之前的 Date類,你可以使用 Date 類和 Instant 類各自的轉(zhuǎn)換方法互相轉(zhuǎn)換,例如:Date.from(Instant) 將 Instant 轉(zhuǎn)換成java.util.Date,Date.toInstant() 則是將 Date 類轉(zhuǎn)換成 Instant 類。

示例 18、在 Java 8 中如何使用預(yù)定義的格式化工具去解析或格式化日期

在 Java 8 以前的世界里,日期和時間的格式化非常詭異,唯一的幫助類 SimpleDateFormat 也是非線程安全的,而且用作局部變量解析和格式化日期時顯得很笨重。幸好線程局部變量能使它在多線程環(huán)境中變得可用,不過這都是過去時了。Java 8 引入了全新的日期時間格式工具,線程安全而且使用方便。它自帶了一些常用的內(nèi)置格式化工具。

參見我上一篇文章: 《SimpleDateFormat 如何安全的使用?》

示例 19、如何在 Java 中使用自定義格式化工具解析日期

盡管內(nèi)置格式化工具很好用,有時還是需要定義特定的日期格式。可以調(diào)用 DateTimeFormatter 的 ofPattern() 靜態(tài)方法并傳入任意格式返回其實例,格式中的字符和以前代表的一樣,M 代表月,m 代表分。如果格式不規(guī)范會拋出 DateTimeParseException 異常,不過如果只是把 M 寫成 m 這種邏輯錯誤是不會拋異常的。

參見我上一篇文章: 《SimpleDateFormat 如何安全的使用?》

示例 20、在 Java 8 中如何把日期轉(zhuǎn)換成字符串

上兩個主要是從字符串解析日期。現(xiàn)在我們反過來,把 LocalDateTime 日期實例轉(zhuǎn)換成特定格式的字符串。這是迄今為止 Java 日期轉(zhuǎn)字符串最為簡單的方式了。下面的例子將返回一個代表日期的格式化字符串。和前面類似,還是需要創(chuàng)建 DateTimeFormatter 實例并傳入格式,但這回調(diào)用的是 format() 方法,而非 parse() 方法。這個方法會把傳入的日期轉(zhuǎn)化成指定格式的字符串。

1LocalDateTime arrivalDate  = LocalDateTime.now();
2try {
3    DateTimeFormatter format = DateTimeFormatter.ofPattern("MMMdd yyyy  hh:mm a");
4    String landing = arrivalDate.format(format);
5    System.out.printf("Arriving at :  %s %n", landing);
6}catch (DateTimeException ex) {
7    System.out.printf("%s can"t be formatted!%n", arrivalDate);
8    ex.printStackTrace();
9}
Java 8 日期時間 API 的重點

通過這些例子,你肯定已經(jīng)掌握了 Java 8 日期時間 API 的新知識點。現(xiàn)在來回顧一下這個優(yōu)雅 API 的使用要點:

1)提供了 javax.time.ZoneId 獲取時區(qū)。

2)提供了 LocalDate 和 LocalTime 類。

3)Java 8 的所有日期和時間 API 都是不可變類并且線程安全,而現(xiàn)有的 Date 和 Calendar API 中的 java.util.Date 和SimpleDateFormat 是非線程安全的。

4)主包是 java.time, 包含了表示日期、時間、時間間隔的一些類。里面有兩個子包 java.time.format 用于格式化, java.time.temporal 用于更底層的操作。

5)時區(qū)代表了地球上某個區(qū)域內(nèi)普遍使用的標(biāo)準(zhǔn)時間。每個時區(qū)都有一個代號,格式通常由區(qū)域/城市構(gòu)成(Asia/Tokyo),在加上與格林威治或 UTC 的時差。例如:東京的時差是 +09:00。

6)OffsetDateTime 類實際上組合了 LocalDateTime 類和 ZoneOffset 類。用來表示包含和格林威治或 UTC 時差的完整日期(年、月、日)和時間(時、分、秒、納秒)信息。

7)DateTimeFormatter 類用來格式化和解析時間。與 SimpleDateFormat 不同,這個類不可變并且線程安全,需要時可以給靜態(tài)常量賦值。DateTimeFormatter 類提供了大量的內(nèi)置格式化工具,同時也允許你自定義。在轉(zhuǎn)換方面也提供了 parse() 將字符串解析成日期,如果解析出錯會拋出 DateTimeParseException。DateTimeFormatter 類同時還有format() 用來格式化日期,如果出錯會拋出 DateTimeException異常。

8)再補(bǔ)充一點,日期格式“MMM d yyyy”和“MMM dd yyyy”有一些微妙的不同,第一個格式可以解析“Jan 2 2014”和“Jan 14 2014”,而第二個在解析“Jan 2 2014”就會拋異常,因為第二個格式里要求日必須是兩位的。如果想修正,你必須在日期只有個位數(shù)時在前面補(bǔ)零,就是說“Jan 2 2014”應(yīng)該寫成 “Jan 02 2014”。

推薦閱讀:

《深入理解 Java 內(nèi)存模型》讀書筆記

面試-基礎(chǔ)篇

Spring Boot 2.0 遷移指南

SpringBoot使用Docker快速部署項目

為什么選擇 Spring 作為 Java 框架?

SpringBoot RocketMQ 整合使用和監(jiān)控

Spring Boot 面試的十個問題

使用 Spring Framework 時常犯的十大錯誤

SpringBoot Admin 使用指南

SpringBoot Kafka 整合使用

SpringBoot RabbitMQ 整合使用

Elasticsearch索引增量統(tǒng)計及定時郵件實現(xiàn)

Elasticsearch實戰(zhàn) | 必要的時候,還得空間換時間!
干貨 |《從Lucene到Elasticsearch全文檢索實戰(zhàn)》拆解實踐

上篇好文:

JVM面試問題系列:JVM 配置常用參數(shù)和常用 GC 調(diào)優(yōu)策略

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76192.html

相關(guān)文章

  • Java編程基礎(chǔ)20——異常&IO(File類)

    摘要:異常異常的概述和分類異常的概述異常就是程序在運行過程中出現(xiàn)的錯誤。運行時異常就是程序員所犯的錯誤,需要回來修改代碼。獲取異常類名和異常信息,返回字符串。如果路徑名不同,就是改名并剪切。刪除注意事項中的刪除不走回收站。 1_異常(異常的概述和分類) A:異常的概述 異常就是Java程序在運行過程中出現(xiàn)的錯誤。 B:異常的分類 通過API查看Throwable Error 服務(wù)...

    church 評論0 收藏0
  • ELSE 技術(shù)周刊(2017.11.20期)

    摘要:業(yè)界動態(tài)發(fā)布重大更新,新版本建立在一個全新的的引擎之上,速度是個月前的兩倍。值得一提的是,該特性并未加到中,而是作為單獨依賴包。過濾繞過速查表本篇文章的主要目的是給專業(yè)安全測試人員提供一份跨站腳本漏洞檢測指南。預(yù)計閱讀時間分鐘。 業(yè)界動態(tài) Introducing the New Firefox: Firefox Quantum FireFox 發(fā)布重大更新,新版本建立在一個全新的的引擎...

    mindwind 評論0 收藏0
  • 大聰明教你學(xué)Java | Hutool - A set of tools that keep Jav

    摘要:打印字符串我在人民廣場吃著炸雞打印字符串模板我在吃著炸雞人民廣場我在人民廣場吃著炸雞打印數(shù)組日志工具封裝的日志工廠兼容了各大日志框架,使用起來也非常簡便。 前言 無...

    Ververica 評論0 收藏0
  • Java8實戰(zhàn)》-第十二章筆記(新的日期時間API)

    摘要:合并日期和時間這個復(fù)合類名叫,是和的合體。截至目前,我們介紹的這些日期時間對象都是不可修改的,這是為了更好地支持函數(shù)式編程,確保線程安全,保持領(lǐng)域模式一致性而做出的重大設(shè)計決定。 新的日期和時間API Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過,Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗的程序員都會贊同Java 8之前的庫對日期和時間的支持就非常不理想...

    khlbat 評論0 收藏0
  • [譯]148資源讓你成為CSS專家

    摘要:層疊樣式表二修訂版這是對作出的官方說明。速查表兩份表來自一份關(guān)于基礎(chǔ)特性,一份關(guān)于布局。核心第一篇一份來自的基礎(chǔ)參考指南簡寫速查表簡寫形式參考書使用層疊樣式表基礎(chǔ)指南,包含使用的好處介紹個方法快速寫成高質(zhì)量的寫出高效的一些提示。 迄今為止,我已經(jīng)收集了100多個精通CSS的資源,它們能讓你更好地掌握CSS技巧,使你的布局設(shè)計脫穎而出。 CSS3 資源 20個學(xué)習(xí)CSS3的有用資源 C...

    impig33 評論0 收藏0

發(fā)表評論

0條評論

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