1.8以前JDK自帶的日期處理類很是不方便,咱們處理的時候常常是使用的第三方工具包,好比commons-lang包等。不過1.8出現以後這個改觀了不少,好比日期時間的建立、比較、調整、格式化、時間間隔等。這些類都在java.time包下。比原來實用了不少。java
不變性:新的日期/時間API中,全部的類都是不可變的,這對多線程環境有好處。安全
關注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它爲日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不一樣的類。多線程
清晰:在全部的類中,方法都被明肯定義用以完成相同的行爲。舉個例子,要拿到當前實例咱們可使用now()方法,在全部的類中都定義了format()和parse()方法,而不是像之前那樣專門有一個獨立的類。爲了更好的處理問題,全部的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其餘類協同工做並不困難。工具
實用操做:全部新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分等。測試
Java日期/時間API包含如下相應的包。
java.time包:這是新的Java日期/時間API的基礎包,全部的主要基礎類都是這個包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。全部這些類都是不可變的和線程安全的,在絕大多數狀況下,這些類可以有效地處理一些公共的需求。
java.time.chrono包:這個包爲非ISO的日曆系統定義了一些泛化的API,咱們能夠擴展AbstractChronology類來建立本身的日曆系統。
java.time.format包:這個包包含可以格式化和解析日期時間對象的類,在絕大多數狀況下,咱們不該該直接使用它們,由於java.time包中相應的類已經提供了格式化和解析的方法。
java.time.temporal包:這個包包含一些時態對象,咱們能夠用其找出關於日期/時間對象的某個特定日期或時間,好比說,能夠找到某月的第一天或最後一天。你能夠很是容易地認出這些方法,由於它們都具備「withXXX」的格式。 java.time.zone包:這個包包含支持不一樣時區以及相關規則的類 spa
LocalDate:LocalDate是final修飾的類,它表示默認格式(yyyy-MM-dd)的日期線程
public static void localDate(){ // 當前日期yyyy-MM-dd LocalDate localDate = LocalDate.now(); System.out.println("當前日期yyyy-MM-dd:"+localDate); // 建立一個日期 指定時間 LocalDate localDate1 = LocalDate.of(2015,4,4); System.out.println("建立一個日期:"+localDate1); // 獲取指定時區的當前時間 LocalDate localDate2 = LocalDate.now(ZoneId.of("Asia/Kolkata")); System.out.println("指定時區的當前時間"+localDate2); // 格林威治時間+天數 //默認獲取的是以UTC時區,世界協調時間,爲基礎 LocalDate localDate3 = LocalDate.ofEpochDay(365); System.out.println("格林威治時間+天數"+localDate3); // 某年的第幾天的日期 LocalDate localDate4 = LocalDate.ofYearDay(2015,200); System.out.println("某年的第幾天的日期"+localDate4); }
結果:unix
LocalTime是一個不可變的類,它的實例表明一個符合人類可讀格式的時間,默認格式是hh:mm:ss.zzz。code
public static void localTime(){ //當前時間 LocalTime localTime = LocalTime.now(); System.out.println("當前時間: "+localTime); //建立指定時間 LocalTime localTime1 = LocalTime.of(10,11,12,13); System.out.println(" 建立指定時間: "+localTime1); // 獲取指定時區當前時間 LocalTime localTime2 = LocalTime.now(ZoneId.of("Asia/Kolkata")); System.out.println("獲取指定時區當前時間: "+localTime2); // 當天多少秒的時間 LocalTime localTime3 = LocalTime.ofSecondOfDay(2000); System.out.println("當天多少秒的時間"+localTime3); }
結果:orm
LocalDateTime是一個不可變的日期-時間對象,它表示一組日期-時間,默認格式是yyyy-MM-dd-HH-mm-ss.zzz。它提供了一個工廠方法,接收LocalDate和LocalTime輸入參數,建立LocalDateTime實例
public static void localDateTime(){ // 當前日期時間 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("當前日期時間: "+localDateTime); // 當前日期時間 調用工廠方法 LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(),LocalTime.now()); System.out.println("調用工廠方法: "+localDateTime1); // 指定時間日期時間 LocalDateTime localDateTime2 = LocalDateTime.of(2010,10,10,10,10,10,10); System.out.println("指定時間日期時間: "+localDateTime2); // 當前指定時區日期時間 LocalDateTime localDateTime3 = LocalDateTime.now(ZoneId.of("Asia/Kolkata")); System.out.println("當前指定時區日期時間: "+localDateTime3); // 格林威治後多少分鐘的日期時間 LocalDateTime localDateTime4 = LocalDateTime.ofEpochSecond(10000,0, ZoneOffset.UTC); System.out.println("格林威治後多少分鐘的日期時間: "+localDateTime4); }
結果:
Instant類是用在機器可讀的時間格式上的,它以Unix時間戳的形式存儲日期時間。
public static void instant(){ Instant instant = Instant.now(); System.out.println(instant); Instant instant1 = Instant.ofEpochMilli(instant.toEpochMilli()); System.out.println(instant1); Duration duration = Duration.ofDays(30); System.out.println(duration); }
結果:
Date與LocalDateTime、LocalDate、LocalTime互轉
// 01. java.util.Date --> java.time.LocalDateTime public void UDateToLocalDateTime() { System.out.println("01. java.util.Date --> java.time.LocalDateTime"); Date date = new Date(); System.out.println("Date: "+date); Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); System.out.println("LocalDateTime: "+localDateTime); System.out.println("-----------------------------------------------------------------"); } // 02. java.util.Date --> java.time.LocalDate public void UDateToLocalDate() { System.out.println("02. java.util.Date --> java.time.LocalDate"); Date date = new Date(); System.out.println("Date: "+date); Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); LocalDate localDate = localDateTime.toLocalDate(); System.out.println("localDate: "+localDate); System.out.println("-----------------------------------------------------------------"); } // 03. java.util.Date --> java.time.LocalTime public void UDateToLocalTime() { System.out.println("03. java.util.Date --> java.time.LocalTime"); Date date = new Date(); System.out.println("Date: "+date); Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); LocalTime localTime = localDateTime.toLocalTime(); System.out.println("localTime: "+localTime); System.out.println("-----------------------------------------------------------------"); } // 04. java.time.LocalDateTime --> java.util.Date public void LocalDateTimeToUdate() { System.out.println("04. java.time.LocalDateTime --> java.util.Date"); LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("localDateTime: "+localDateTime); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant); System.out.println("date: "+date); System.out.println("-----------------------------------------------------------------"); } // 05. java.time.LocalDate --> java.util.Date public void LocalDateToUdate() { System.out.println("05. java.time.LocalDate --> java.util.Date"); LocalDate localDate = LocalDate.now(); System.out.println("localDate: "+localDate); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDate.atStartOfDay().atZone(zone).toInstant(); Date date = Date.from(instant); System.out.println("date: "+date); System.out.println("-----------------------------------------------------------------"); } // 06. java.time.LocalTime --> java.util.Date public void LocalTimeToUdate() { System.out.println("06. java.time.LocalTime --> java.util.Date"); LocalTime localTime = LocalTime.now(); LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); System.out.println("localDateTime: "+localDateTime); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant); System.out.println("date: "+date); }
結果:
應用:根據身份證號求年齡
public static int age(String number){ int year = Integer.parseInt(number.substring(6,10));//年 int mouth = Integer.parseInt(number.substring(10,12));//月 int day = Integer.parseInt(number.substring(12,14));//日 LocalDate birthday = LocalDate.of(year,mouth,day);//出生日期 LocalDate today = LocalDate.now();//當前日期 Period period = Period.between(birthday,today); return period.getYears(); }
測試:
public static void main(String[] args) { System.out.println("當前年齡: "+age("511623199604188016")); }
結果: