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

結果:

相關文章
相關標籤/搜索