LocalDate的API操作

package com.akaiqi.chun.time;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;

import static java.time.temporal.ChronoField.DAY_OF_MONTH;
import static java.time.temporal.ChronoUnit.DAYS;

/**
 * 日期:年-月-日
 *
 * @author akaiqi
 * @date 2019/11/1 15:18
 */
public class LocalDateTest {


    /**
     * 通過靜態工廠方法of創建一個LocalDate實例
     * 然後獲取這個時間年,月,日,一年的第幾天,星期幾等
     */
    private static void test1() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date); //2019-11-01
        int year = date.getYear();
        Month month = date.getMonth();
        System.out.println(month); //NOVEMBER
        System.out.println(month.getValue());//11
        int day = date.getDayOfMonth();
        System.out.println(day);//1
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        System.out.println(dayOfWeek);//FRIDAY
        int len = date.lengthOfMonth();
        System.out.println(len);//(這個月有)30
        boolean leap = date.isLeapYear();
        System.out.println(leap);//false(閏年?)
    }

    /**
     * 從系統時鐘中獲取當前的日期,
     * 使用TemporalField讀取LocalDate的值,使用get()方法獲取
     * TemporalField是一個最終的、不可變的、線程安全的枚舉。
     */
    private static void test2() {
        LocalDate today = LocalDate.now();
        System.out.println(today);
        int year = today.get(ChronoField.YEAR);
        int month = today.get(ChronoField.MONTH_OF_YEAR);
        int day = today.get(ChronoField.DAY_OF_MONTH);
        System.out.println(year + "年");//2019年
        System.out.println(month + "月");//11月
        System.out.println(day + "日");//1日
    }

    /**
     * compareTo:將此日期與另一個日期進行比較。比較器值爲負,如果較小,則如果較大則爲正
     * 一般都是LocalDate 類型比較,如果一些被比較的日期是不同的年表,那麼年齡也被考慮,見ChronoLocalDate.compareTo(java.time.chrono.ChronoLocalDate)
     * <p>
     * equals(Object obj):如果這等於其他日期,則爲真 obj=null返回false.源碼實現:同一對象返回true,是LocalDate實例,則分別按年-月-日取比較
     * hashCode:日期的哈希碼,同一時間的哈希值一樣
     */
    private static void test3() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2019, 11, 2);
        LocalDate date3 = LocalDate.of(2020, 11, 1);
        LocalDate date4 = LocalDate.of(2019, 11, 1);
        System.out.println(date1.compareTo(date2));//-1
        System.out.println(date1.compareTo(date3));//-1
        System.out.println(date3.compareTo(date2));//1

        System.out.println(date1.equals(date4));//true
        System.out.println(date1.equals(date2));//false

        System.out.println(date1.hashCode());//4135617 同一時間的哈希值一樣
        System.out.println(date4.hashCode());//4135617
    }

    /**
     * format(DateTimeFormatter formatter):日期格式化
     */
    private static void test4() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        String dateStr1 = date.format(DateTimeFormatter.ofPattern("yyyy MM dd"));
        System.out.println(dateStr1); //2019 11 01
        String dateStr2 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
        System.out.println(dateStr2);//2019年11月01日
        String dateStr3 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月"));
        System.out.println(dateStr3);//2019年11月
    }

    /**
     * lengthOfMonth:這個月有多少天
     * lengthOfYear:今年有多少天
     */
    private static void test5() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.lengthOfMonth());//30
        System.out.println(date.lengthOfYear());//365
    }

    /**
     * minusMonths(long monthsToSubtract):減去monthsToSubtract個月後的日期
     * minusDays(long daysToSubtract):減去daysToSubtract日後的日期
     * minusMonths(long monthsToSubtract) :返回此 LocalDate一個副本,其中指定的週期以周爲單位減去
     * minusYears(long yearsToSubtract) :返回此 LocalDate的副本,以減去的年份爲單位
     * <p>
     * minus(long amountToSubtract, TemporalUnit unit) :返回此日期的副本,減去指定的單位。unit時間單位
     */
    private static void test6() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.minusMonths(1));//2019-10-01
        System.out.println(date.minusDays(1));//2019-10-31
        System.out.println(date.minusWeeks(1));//2019-10-25
        System.out.println(date.minusYears(1));//2018-11-01

        System.out.println(date.minus(1, DAYS));//2019-10-31
        //同理,還有其他單位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS
    }

    /**
     * plus(long amountToAdd, TemporalUnit unit) :返回此日期的副本,並添加指定的時間單位
     * plusDays(long daysToAdd) :日增加
     * plusMonths(long monthsToAdd):月增加
     * plusWeeks(long weeksToAdd):星期增加
     * plusYears(long yearsToAdd):年增加
     */
    private static void test7() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.plus(1, DAYS));//2019-11-02
        //同理,還有其他單位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS,
    }

    /**
     * query(TemporalQuery<R> query):獲取某個字段的範圍
     * range(TemporalField field)
     * <p>
     * toEpochDay():將此日期轉換爲大紀元日。
     * <p>
     * toString():輸入日期(字符串類型)
     */
    private static void test8() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.range(ChronoField.DAY_OF_MONTH));//這個月的範圍:1 - 30

        System.out.println(date.toEpochDay()); //18201
    }

    /**
     * until:計算兩個LocalDate對象之間的時間量,單個TemporalUnit
     * <p>
     * until(Temporal endExclusive,TemporalUnit unit):兩個日期之間的相差多少,可轉換單位:DAYS,MONTHS(TemporalUnit)等
     * 等價於TemporalUnit.between(Temporal, Temporal)
     */
    private static void test9() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2019, 12, 1);
        System.out.println(date1.until(date2));//P1M
        System.out.println(date1.until(date2, DAYS));//30
        //方法二
        System.out.println(DAYS.between(date1, date2));//30
    }

    /**
     * with(TemporalField field,long newValue):按指定單位修改日期
     * <p>
     * withYear(int year):修改年份
     * withMonth(int month):修改月份
     * withDayOfMonth(int dayOfMonth):修改日
     * <p>
     * withDayOfYear
     */
    private static void test10() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        LocalDate date2 = date.with(DAY_OF_MONTH, 2);//2019-11-02  年月不變,修改日期
        System.out.println(date2);

        LocalDate date3 = date.withYear(2020);
        System.out.println(date3);//2020-11-01

        LocalDate date4 = date.withMonth(12);
        System.out.println(date4);//2019-12-01

        LocalDate date5 = date.withDayOfMonth(30);
        System.out.println(date5);//2019-11-30
    }


    /**
     * adjustInto:調整指定的時間對象與此對象的日期相同。
     * 等價於使用Temporal.with(TemporalField, long)通過ChronoField.EPOCH_DAY作爲字段
     */
    private static void test11() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2020, 1, 1);
        Temporal temporal = date1.adjustInto(date2);
        System.out.println(temporal);//2019-11-01
        System.out.println(temporal.with(date2));//2020-01-01

    }

    /**
     * 獲取LocalDateTime:年與日時分秒
     * atStartOfDay():在此日期開始之前的午夜00:00時時間
     * atTime(int hour, int minute, int second):結合此日期與時間創建一個 LocalDateTime 。
     * atTime(int hour, int minute)
     * atTime(int hour, int minute, int second, int nanoOfSecond)
     * atTime(LocalTime time) :LocalTime時分秒
     */
    private static void test12() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.atStartOfDay());//2019-11-01T00:00
        LocalDateTime time = date.atTime(12, 0, 0);
        System.out.println(time);//2019-11-01T12:00

        LocalTime localTime = LocalTime.of(1, 1, 1);
        System.out.println(localTime);//01:01:01
        LocalDateTime localDateTime = date.atTime(localTime);
        System.out.println(localDateTime);//2019-11-01T01:01:01
    }


    public static void main(String[] args) {
        test12();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章