Java中使用LocalDate根據日期來計算年齡

来源:https://www.cnblogs.com/limuyuan/archive/2018/01/06/java-use-localdate-calculate-age.html
-Advertisement-
Play Games

利用Java 8中新引入的LocalDate類來計算時間間隔,本文將用一段極其簡單的代碼來示範如何計算兩個日期之間間隔的年數。 ...


Java中和日期直接相關的類有很多,平時最常用到的就是java.util package下麵的Date和Calendar,需要用到格式的時候還會用到java.text.SimpleDateFormat

首先吐槽一下,Date和Calendar實際用起來還是有一些彆扭的,剛開始用的時候不熟悉,老是分不清Date和Calendar類的具體用法和區別。

而且Calendar類的set方法來設置日期時又有一些反人類,設置月份的時候總是要腦補一下減去1,比如要設置為2018年1月6日就要設置成2018,0,6,因為在這裡一月是用0來表示的:

Calendar cal = Calendar.getInstance();
cal.set(2018, 0, 8);

具體的原因可以看這裡的回答:StackOverflow: Why is January month 0 in Java Calendar?

反正我是不太看得下去。。

 

前幾天有一個簡單的需求,就是根據某兩個日期來計算出年齡。上網查了一下,直接拋棄了難用的Date和Calendar類,直接用java.time.LocalDate來做。話不多說直接上代碼:

import java.time.LocalDate;

public class TestLocalDate {
    public static void main(String[] args) {
        LocalDate date1 = LocalDate.of(2018, 1, 6);
        LocalDate date2 = LocalDate.of(1991, 1, 3);
        int age = date2.until(date1).getYears();

        System.out.println("You're " + age + " years old.");
    }
}

輸出結果:

You're 27 years old.

拋棄了略顯複雜令人頭大的Date和Calendar類之間的互相轉換調用,代碼讀起來也特別清晰,是不是很爽!

java.time是Java 8中新引入的一個日期時間庫,下麵的這些方法都是java.time包裡面的。

下麵來看一下這段代碼是怎麼來用簡單清爽的方式計算時間差的:

首先,LocalDate是一個immutable class(不可變類),所以和String類一樣,不需要new一個新的對象才可以使用(?)

然後是LocalDate類用於設定日期的of方法:

public static LocalDate of(int year, Month month, int dayOfMonth)
public static LocalDate of(int year, int month, int dayOfMonth)

of一共有三個重載的方法,這裡舉出其中的兩個。第一個的Month類是一個枚舉類型,包含了月份的英文名稱,如JANUARY, NOVEMBER等

第二個就是再正常不過的設置年月日,好消息是這裡的month是從1開始的,也就是說再也不用手動減去1了!!!

下麵是LocalDate類用於比較日期的until方法:

public Period until(ChronoLocalDate endDateExclusive)

這個方法返回的是一個Period類型的對象。

Period代表的是形如“2年,3個月,4天”的一段時間間隔。接下來調用的getYears方法就是屬於Period類的。

最後再來看一下Period類的一些獲取時間間隔的方法:

public int getYears()
public int getMonths()
public int getDays()

這三個方法分別用於獲取時間間隔的年、月和日。對,就是這麼簡單。

閑來無事時看看語言的新特性,多掌握些技能總是不會錯的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Spring核心配置文件中沒有增加事務方法,導致以上問題 Action類UserAction UserService類 UserDao介面 UserDaoImplements類 User實體類: web.xml 自動啟動監聽和過濾器 Spring核心配置文件bean.xml 通過引入各個分模塊 分 ...
  • Python創建類的時候為什麼要繼承新式類?看完這篇文章或許你就明白了。 ...
  • CRM項目總結 一:開發背景 在公司日益擴大的過程中,不可避免的會伴隨著更多問題出現。 對外 : 如何更好的管理客戶與公司的關係?如何更及時的瞭解客戶日益發展的需求變化?公司的產品是否真的符合客戶需求?以及公司新產品信息是否更有針對性的及時推送給客戶?客戶沒有 對內 : 公司發展壯大,部門越來越多, ...
  • 前言 本人在通過《C語言程式設計:現代方法(第2版)》自學C語言時,發現國內並沒有該書完整的課後習題答案,所以就想把自己在學習過程中所做出的答案分享出來,以供大家參考。這些答案是本人自己解答,並參考GitHub上相關的分享和Chegg.com相關資料。因為並沒有權威的答案來源,所以可能會存在錯誤的地 ...
  • 用以前學過的知識,可以簡單地做一個超市庫存管理系統: 定義一個商品類: 然後: ...
  • 首先是打開Content Assistant,自動代碼補全 Window Preferences Java Editor Content Assist,在最下麵的Auto Activation區域的Auto activation triggers for java裡面把26個英文字母都敲一遍 CTR ...
  • 定時任務總會遇到任務重疊執行的情況,比如一個任務1分鐘執行一次,而任務的執行時間超過了1分鐘,這樣就會有兩個相同任務併發執行了。有時候我們是允許這種情況的發生的,比如任務執行的代碼是冪等的,而有時候我們可能考慮到一些情況是不允許這種事情發生的。 在實際場景中,我們定時任務調度使用quartz來實現觸 ...
  • 凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 某糖果廠用原料A、B和C按不向比率混合加工而成甲、乙、丙三種糖果(假設混合加工中不損耗原料)。原料A、B、C在糖果甲、乙、丙中的含量、原料成本、加工成本、原料限量及糖果售價如表所示。 問該廠對這三種糖果各生產多 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...