1. 程式人生 > >Java8學習筆記之新日期API

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