Java8 新的日期和時間 API

jopen 8年前發布 | 17K 次閱讀 Java8 Java開發

 

時間線

在 Java 當中,一個 Instant 對象表示時間軸上的一個點。并且我們可以計算兩個時間點之間的時間量。

@Test
    public void test1() throws Exception {
        // Instant.now() 獲取當前時間瞬時點
        Instant begin = Instant.now();
        System.out.println(begin);
        Thread.sleep(200);
        Instant end = Instant.now();
        System.out.println(end);

    // Duration表示兩個瞬時點之間的持續時間
    Duration duration = Duration.between(begin, end);
    System.out.println(duration.toMillis());

    // 可以對 Duration 和 Instant 進行數學操作
    System.out.println(end.plusSeconds(20));
    System.out.println(duration.plusMillis(500).toMillis());
}</pre><br />

本地日期

本地日期/時間表示一個日期或時間,但是不關聯任何時區信息。

@Test
    public void test2() {
        // LocalDate.now() 獲取本地今天日期
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        // LocalDate.of() 創建日期 2015-12-22
        LocalDate localDate2 = LocalDate.of(2015, 12, 22);
        System.out.println(localDate2);
        System.out.println(localDate2.plusDays(1));
        System.out.println(localDate.isBefore(localDate2));
        LocalDate localDate3 = localDate2.plus(Period.ofDays(3));
        System.out.println(localDate.isBefore(localDate3));
        System.out.println(localDate2.until(localDate3, ChronoUnit.DAYS));//返回兩個本地日期時間的距離
        System.out.println(localDate3.getDayOfWeek());//星期幾
    }

兩個瞬時點 Instant 之間的距離就是一個持續時間 Duration。對于本地日期對應的對象就是時段 Period。

日期校正器

如果我們需要進行調度,例如每個月的第一個周二這樣的日期。 TemporalAdjusters 類提供了很多靜態方法來進行常用的校正。

@Test
    public void test3() {
        LocalDate localDate = LocalDate.of(2015, 1, 1).with(
                TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));// 從指定日期開始的后一個星期幾
        System.out.println(localDate);
        LocalDate localDate2 = localDate.with(TemporalAdjusters.previous(DayOfWeek.TUESDAY));// 指定日期的前一個星期幾
        LocalDate localDate3 = localDate.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));// 指定日期的后一個星期幾
        System.out.println(localDate2);
        System.out.println(localDate3);
        LocalDate localDate4 = localDate.with(TemporalAdjusters.dayOfWeekInMonth(3,
                DayOfWeek.TUESDAY));// 第三個周二
        System.out.println(localDate4);
        LocalDate localDate5 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.TUESDAY));
        System.out.println(localDate5);

    TemporalAdjuster Next_WorkDay = w -> {//自定義校正器
        LocalDate resultDate = (LocalDate) w;
        do {
            resultDate = resultDate.plusDays(1);
        } while (resultDate.getDayOfWeek().getValue() >= 6);
        return resultDate;
    };
}</pre><br />

本地時間

LocalTime 表示一天當中的某個時間,例如 15:00.

@Test
    public void test4() {
        LocalTime localTime = LocalTime.now();
        LocalTime localTime2 = LocalTime.of(12, 24);
        System.out.println(localTime);
        System.out.println(localTime2);
        // 其他 api 與 LocalDate 類似
        LocalDateTime localDateTime = LocalDateTime.now();
        LocalDateTime localDateTime2 = LocalDateTime.of(2015, 12, 22, 3, 14, 23);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);
        // 其他 api 與 LocalDate 類似
    }

格式化和解析

DateTimeFormatter 提供了三種格式化的方法來打印日期:

  1. 預定義的標準格式
  2. 語言相關的格式
  3. 自定義格式
  4. </ol>

    @Test
        public void test5() {
            LocalDateTime localDateTime = LocalDateTime.now();
            System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));// 預定義標準格式
            System.out.println(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));// 預定義標準格式

        System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
                .format(localDateTime));// 語言相關格式
        System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(
                localDateTime));// 語言相關格式
        System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).format(
                localDateTime));// 語言相關格式
        System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(
                localDateTime));// 語言相關格式,一般使用這個
    
        System.out
                .println(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(localDateTime));// 自定義
    }</pre><br />
    

    遺留代碼操作

    Instant 類似于 java.util.Date 類,在 java8 當中 java.util.Date 新增兩個方法:toInstant,還有 from 方法來相互轉換。

    【參考資料】

    1. 寫給大忙人看的Java SE 8
    2. </ol>

      ---EOF---


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!