java1.8新特性(五)Date API

1、爲何咱們須要新的Java日期/時間API?

1.8以前JDK自帶的日期處理類很是不方便,咱們處理的時候常常是使用的第三方工具包,好比commons-lang包等。不過1.8出現以後這個改觀了不少,好比日期時間的建立、比較、調整、格式化、時間間隔等。這些類都在java.time包下。比原來實用了不少。java

2、Java8日期/時間API的特色

不變性:新的日期/時間API中,全部的類都是不可變的,這對多線程環境有好處。安全

關注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它爲日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不一樣的類。多線程

清晰:在全部的類中,方法都被明肯定義用以完成相同的行爲。舉個例子,要拿到當前實例咱們可使用now()方法,在全部的類中都定義了format()和parse()方法,而不是像之前那樣專門有一個獨立的類。爲了更好的處理問題,全部的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其餘類協同工做並不困難。工具

實用操做:全部新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分等。測試

3、Java日期/時間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

四,新Date經常使用的類及方法

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")); }

結果:

相關文章
相關標籤/搜索