java8 – 新的時間日期API示例

獨特潤許多人發表於2019-02-23

  Java 8之前的庫對時間和日期的支援非常不理想,不用擔心,在Java 8中引入全新的時間和日期API,並且都是執行緒安全的

  • 新時間日期API常用物件介紹

    LocalDate: 表示沒有時區的日期, LocalDate是不可變且執行緒安全

    LocalTime: 表示沒有時區的時間, LocalTime是不可變且執行緒安全

    LocalDateTime: 表示沒有時區的日期時間, LocalDateTime是不可變且執行緒安全

    ZoneId: 時區ID,用來確定Instant和LocalDateTime互相轉換的規則

    Instant: 用來表示時間線上的一個點(瞬時/時間戳)

    Clock: 用於訪問當前時刻、日期、時間,用到時區

    Duration: 用秒和納秒錶示時間的數量(長短),用於計算兩個日期的“時間”間隔

    Period: 用於計算兩個“日期”間隔

    其中,LocalDate、LocalTime、LocalDateTime是新API裡的基礎物件:

      LocalDate : 只含年月日的日期物件

      LocalTime :只含時分秒的時間物件

      LocalDateTime : 同時含有年月日時分秒的日期物件

 

  • 新時間日期API示例

     (1)獲取當前時間:

        - now() : 靜態方法,根據當前時間建立物件

    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDate);
    System.out.println(localTime);
    System.out.println(localDateTime);
    /*
      輸出:
               2019-02-23
               19:23:10.865021300
               2019-02-23T19:23:10.866021400
     */    

       (2)獲取當前年、月、日

    LocalDate today = LocalDate.now();
    int year = today.getYear();
    int month = today.getMonthValue();
    int day = today.getDayOfMonth();
    System.out.println("年:"+year+"
月:"+month+"
日:"+day);
    /*
      輸出:
             年:2019
        月:2
        日:23
     */                

     (3)根據指定日期時間建立物件

         – of() : 靜態方法  並返回一個LocalDate例項

    LocalDate localDate = LocalDate.of(2019, 2, 23);
    LocalTime localTime = LocalTime.of(9, 43, 20);
    LocalDateTime localDateTime = LocalDateTime.of(2019, 2, 23, 9, 43, 20);
    System.out.println(localDate);
    System.out.println(localTime);
    System.out.println(localDateTime);
  /*
     輸出:
             2019-02-23
             9:43:20
             2019-02-23T9:43:20
    */

     (4)檢查兩個日期是否相等

         LocalDate重寫了equals方法來進行日期的比較

    LocalDate today = LocalDate.now();
    LocalDate day = LocalDate.of(2019, 2, 14);
    System.out.println("今天的日期是2019-02-14麼?"+today.equals(day));
    // 今天的日期是2019-02-14麼?false

     (5)判斷是否閏年

    LocalDate now = LocalDate.now();
    System.out.println( now + "是否是閏年" + now.isLeapYear());
  // 2019-02-23 是否是閏年 false

     (6)獲取當前時間戳

        Instant類由一個靜態的工廠方法now()可以返回當前時間戳

  Instant instant = Instant.now();
  System.out.println(instant);
  //    2019-02-23T12:19:53.455638400Z

        可以使用這個兩個類中的方法在這兩個型別之間進行轉換

          - Date.from(Instant)就是用來把Instant轉換成java.util.date

          - Date.toInstant()就是將Date轉換成Instant

        以上獲取到的是 UTC 時區的時間,與中國時間相差8小時,可以設定偏移量

  Instant instant = Instant.now();
  System.out.println(instant.atOffset(ZoneOffset.ofHours(8)));
  // 中國當前時間:2019-02-23T20:37:26.980896600+08:00

     (7)兩個日期之間相差多少時間

  LocalDate today = LocalDate.now();
  LocalDate day = LocalDate.of(2018, 2, 14);
  Period period = Period.between(day, today);
   System.out.println(period.getYears()+"-"+period.getMonths()+"-"+period.getDays());
  // 兩者 相差 1年-0月-9天

     (8)獲取這個年中月有多少天

        用於檢查2月是否潤2

  YearMonth yMonth = YearMonth.now();
  System.out.println("這個"+yMonth+"年月有"+yMonth.lengthOfMonth()+"天");
  // 這個2019-02年月有28天

      (9)使用時鐘

        獲取某個時區下當前的瞬時時間、日期,代替System.currentTimelnMillis()與TimeZone.getDefault()方法

  Clock clock = Clock.systemUTC();
  System.out.println(clock);
  // SystemClock[Z]

  Clock.systemDefaultZone();
  System.out.println(clock);
  // SystemClock[Z]

      (10)判斷某個日期在另一個日期的之前/之後

  LocalDate today = LocalDate.now();
  LocalDate tommorow = today.plus(1,ChronoUnit.DAYS);
  System.out.println("明天的日期:"+tommorow);
  System.out.println("日期:"+tommorow+"是否在日期:"+today+"之後:"+tommorow.isAfter(today));
  System.out.println("日期:"+tommorow+"是否在日期:"+today+"之後:"+tommorow.isBefore(today));
  //今天的日期:2019-02-23
  //明天的日期:2019-02-24
  //日期:2019-02-24是否在日期:2019-02-23之後:true
  //日期:2019-02-24是否在日期:2019-02-23之後:false

     (11)時間/日期的修改

  LocalDate nowDate = LocalDate.now();
  System.out.println(nowDate.minusYears(1));//一年前
  System.out.println(nowDate.minusMonths(1));//一月前
  System.out.println(nowDate.minusWeeks(1));//一週前
  System.out.println(nowDate.minusDays(1));//一天前
          
  System.out.println(nowDate.plusYears(1));//一年後
  System.out.println(nowDate.plusMonths(1));//一月後
  System.out.println(nowDate.plusWeeks(1));//一週後
  System.out.println(nowDate.plusDays(1));//一天後
  LocalTime nowTime = LocalTime.now();
  System.out.println(nowTime.minusHours(1));//一小時前
  System.out.println(nowTime.minusMinutes(1));//一分鐘前
  System.out.println(nowTime.minusSeconds(1));//一秒前
  System.out.println(nowTime.minusNanos(1));//一納秒前
   
  System.out.println(nowTime.plusHours(1));//一小時後
  System.out.println(nowTime.plusMinutes(1));//一分鐘後
  System.out.println(nowTime.plusSeconds(1));//一秒後
  System.out.println(nowTime.plusNanos(1));//一納秒後

     (12)時間日期格式化

  LocalDateTime ldt = LocalDateTime.now();
  System.out.println(ldt);//2018-09-06T18:22:47.366
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  String ldtStr = ldt.format(dtf);
  System.out.println(ldtStr);//2018-09-06 18:22:47
  String ldtStr1 = dtf.format(ldt);
  System.out.println(ldtStr1);//2018-09-06 18:22:47

        預定義的格式器來對日期進行解析/格式化:

  String temp = "20190214";
  LocalDate formatted = LocalDate.parse(temp,DateTimeFormatter.BASIC_ISO_DATE);
  System.out.println("格式化後的格式是:"+formatted);
  //  格式化後的格式是:2019-02-14

        自定義解析為日期:

  String str = "01 12 2014";
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");
  LocalDate lDate = LocalDate.parse(str,formatter);
  System.out.println("格式化後的格式是:"+lDate);
   // 格式化後的格式是:2014-01-12

        日期進行格式化,轉換成字串:

  LocalDateTime lDateTime = LocalDateTime.now();
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy HH:mm a");
  String str = localDateTime.format(formatter);
  System.out.println("格式化後的格式是:"+str);
  // 2019-02-23T9:45:20  格式化後的格式是:02 23 2019 22:37 下午 

      OffsetDateTime類實際上包含了LocalDateTime與ZoneOffset。它用來表示一個包含格林威治時間偏移量(+/-小時:分,比如+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒)

      “MMM d yyyy”與“MMm dd yyyy”這兩個日期格式也略有不同,前者能識別出”Jan 2 2019″與”Jan 14 2019″這兩個串,而後者如果傳進來的是”Jan 2 2014″則會報錯,因為它期望月份處傳進來的是兩個字元。為了解決這個問題,在天為個位數的情況下,你得在前面補0,比如”Jan 2 2019″應該改為”Jan 02 2019″

      DateTimeFormatter類用於在Java中進行日期的格式化與解析。與SimpleDateFormat不同,它是不可變且執行緒安全的

      時區指的是地球上共享同一標準時間的地區。每個時區都有一個唯一識別符號,同時還有一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間。比如說,東京的偏移時間就是+09:00

 

相關文章