Java8學習筆記之新日期API

Java8對日期API做了改進,提供了許多好用的方法和接口。
首先,最基本也最重要的3個對象:

  • LocalDate:日期對象
  • LocalTime:時間對象
  • LocalDateTime:日期時間對象,是LocalDateLocalTime的合集

對象的創建

以上這3個對象,都各自有3種創建方式。

  1. 通過.now()得到當前日期時間對象。
  2. 通過.of()直接指定年月日,時分秒。
  3. LocalDateLocalTime通過解析字符串創建,LocalDateTime可以通過前2個對象創建。

LocalDate對象3種創建方式以及相關方法示例

    @Test
    public void localDate() {
        LocalDate date = LocalDate.of(2017, 5, 3);
        int year = date.getYear();// 2017
        Month month = date.getMonth();// MAY
        int day = date.getDayOfMonth();// 3
        DayOfWeek dow = date.getDayOfWeek();// Wednesday
        int len = date.lengthOfMonth();// 31
        boolean leap = date.isLeapYear();// false
        System.out.println(year + ", " + month + ", " + day + ", " + dow + ", " + len + ", " + leap);

        LocalDate date2 = LocalDate.now();
        int year2 = date2.get(ChronoField.YEAR);// 2017
        int month2 = date2.get(ChronoField.MONTH_OF_YEAR);// 5
        int day2 = date2.get(ChronoField.DAY_OF_MONTH);// 3
        int dow2 = date2.get(ChronoField.DAY_OF_WEEK);// 3
        System.out.println(year2 + ", " + month2 + ", " + day2 + ", " + dow2);

        // 寫2017-3-18會報錯,DateTimeParseException異常,可以傳一個DateTimeFormatter自定義格式
        LocalDate date3 = LocalDate.parse("2017-03-18");
        int year3 = date3.get(ChronoField.YEAR);
        int month3 = date3.get(ChronoField.MONTH_OF_YEAR);
        int day3 = date3.get(ChronoField.DAY_OF_MONTH);
        int dow3 = date3.get(ChronoField.DAY_OF_WEEK);
        System.out.println(year3 + ", " + month3 + ", " + day3 + ", " + dow3);
    }

LocalTime對象3種創建方式以及相關方法示例

    @Test
    public void localTime() {
        LocalTime time = LocalTime.of(11, 06, 23);
        int hour = time.getHour();
        int minute = time.getMinute();
        int second = time.getSecond();
        System.out.println(hour + ":" + minute + ":" + second);

        LocalTime time2 = LocalTime.now();
        int hour2 = time2.get(ChronoField.HOUR_OF_DAY);
        int minute2 = time2.get(ChronoField.MINUTE_OF_HOUR);
        int second2 = time2.get(ChronoField.SECOND_OF_MINUTE);
        System.out.println(hour2 + ":" + minute2 + ":" + second2);

        // 寫13:5:43會報錯,DateTimeParseException異常,可以傳一個DateTimeFormatter自定義格式
        LocalTime time3 = LocalTime.parse("13:05:43");
        int hour3 = time3.get(ChronoField.HOUR_OF_DAY);
        int minute3 = time3.get(ChronoField.MINUTE_OF_HOUR);
        int second3 = time3.get(ChronoField.SECOND_OF_MINUTE);
        System.out.println(hour3 + ":" + minute3 + ":" + second3);
    }

LocalDateTime對象3種創建方式以及相關方法示例

    @Test
    public void localDateTime() {
        LocalDate date = LocalDate.now();
        LocalTime time = LocalTime.now();

        // 創建LocalDateTime
        LocalDateTime dateTime = LocalDateTime.of(2017, 5, 3, 11, 53, 23);
        LocalDateTime dateTime2 = LocalDateTime.of(date, time);
        LocalDateTime dateTime3 = date.atTime(11, 53, 23);
        LocalDateTime dateTime4 = date.atTime(time);
        LocalDateTime dateTime6 = time.atDate(date);

        // 轉化
        LocalDate date2 = dateTime2.toLocalDate();
        LocalTime time2 = dateTime2.toLocalTime();
    }

時間間隔對象

  • Duration:可以傳2個localTime對象,localDateTime對象或者Instant對象
  • Period:用年,月,日建模,可以傳2個localDate對象
    @Test
    public void between() {
//        Duration d1 = Duration.between(time1, time2);
//        Duration d2 = Duration.between(dateTime1, dateTime2);
//        Duration d3 = Duration.between(instant1, instant2);
        Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));

        Duration threeMinutes = Duration.ofMinutes(3);
        Duration threeMinutes2 = Duration.of(3, ChronoUnit.MINUTES);
        Period tenDays2 = Period.ofDays(10);
        Period threeWeeks = Period.ofWeeks(3);
        Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
    }

修改日期時間對象

直接使用.with()來修改對應的年月日時分秒屬性

    @Test
    public void editDateTime() {
        LocalDate date1 = LocalDate.of(2014, 3, 18);// 2014-03-18
        LocalDate date2 = date1.withYear(2011);// 2011-03-18
        LocalDate date3 = date2.withDayOfMonth(25);// 2011-03-25
        LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);// 2011-09-25
    }

在現有對象上做相對修改

    @Test
    public void editDateTime() {
        LocalDate date1 = LocalDate.of(2014, 3, 18);// 2014-03-18
        LocalDate date2 = date1.plusWeeks(1);// 2014-03-25
        LocalDate date3 = date2.minusYears(3);// 2011-03-25
        LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);// 2011-09-25
    }

自定義修改日期

如果要對日期做一些復雜的修改,那么可以通過TemporalAdjusters接口實現復雜邏輯。

    @Test
    public void adjust() {
        LocalDate date1 = LocalDate.of(2017, 5, 8);// 2017-05-08
        LocalDate date2 = date1.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));// 2017-05-14
        LocalDate date3 = date2.with(TemporalAdjusters.lastDayOfMonth());// 2017-05-31
    }

jdk為我們實現了一些常用的方法:

  • dayOfWeekInMonth:創建一個新的日期,它的值為同一個月中每一周的第幾天
  • firstDayOfMonth:創建一個新的日期,它的值為當月的第一天
  • firstDayOfNextMonth:創建一個新的日期,它的值為下月的第一天
  • firstDayOfNextYear:創建一個新的日期,它的值為明年的第一天
  • firstDayOfYear:創建一個新的日期,它的值為當年的第一天
  • firstInMonth:創建一個新的日期,它的值為同一個月中,第一個符合星期幾要求的值
  • lastDayOfMonth:創建一個新的日期,它的值為當月的最后一天
  • lastDayOfNextMonth:創建一個新的日期,它的值為下月的最后一天
  • lastDayOfNextYear:創建一個新的日期,它的值為明年的最后一天
  • lastDayOfYear:創建一個新的日期,它的值為今年的最后一天
  • lastInMonth:創建一個新的日期,它的值為同一個月中,最后一個符合星期幾要求的值
  • next/previous:創建一個新的日期,并將其值設定為日期調整后或者調整前,第一個符合指定星期幾要求的日期
  • nextOrSame/previousOrSame:創建一個新的日期,并將其值設定為日期調整后或者調整前,第一個符合指定星期幾要求的日期,如果該日期已經符合要求,直接返回該對象

自定義格式化輸出日期

新版本,我們擁有一個線程安全的類:DateTimeFormatter
來看代碼

    @Test
    public void formatPrint() {
        LocalDate date = LocalDate.of(2014, 3, 18);
        String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);// 20140318
        String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);// 2014-03-18

        LocalDate date1 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
        LocalDate date2 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);

        // 自定義格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String formattedDate = date.format(formatter);
        System.out.println(formattedDate);// 18/03/2014
        LocalDate date3 = LocalDate.parse(formattedDate, formatter);

        // 帶時區的日期(本地化)
        DateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);
        String formattedDate2 = date.format(italianFormatter); // 18. marzo 2014
        LocalDate date4 = LocalDate.parse(formattedDate2, italianFormatter);
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 當你開始使用Java操作日期和時間的時候,會有一些棘手。你也許會通過System.currentTimeMilli...
    程序猿的那些事閱讀 2,296評論 0 1
  • 緒論 我們相信大多數有經驗的程序員都會贊同java8之前的庫對日期和時間的支持非常的不理想。然而,java8引入了...
    潯它芉咟渡閱讀 922評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • Java 8日期/時間( Date/Time)API是開發人員最受追捧的變化之一,Java從一開始就沒有對日期時間...
    xiaogmail閱讀 1,112評論 0 3
  • 我沒有很想你,只是會每天拿起手機習慣性的看看你有沒有更新動態,會專門點進你的朋友圈不厭其煩的看著那條橫線,看看你的...
    孫小山閱讀 846評論 28 10