Jdk8 新日期工具類 Api 學習筆記

三流發表於2022-07-15

Jdk8 新日期工具類 Api 學習筆記

零 版本

Azul Jdk 17.0.2

一 Zone

ZoneId 代表時區,ZoneOffset 代表時區偏移量。

ZoneOffset 是 ZoneId 的子類。

// 1.1 獲取系統時區,以下幾個方法都是等價的
ZoneId zoneId_1_1 = ZoneId.systemDefault();
ZoneId zoneId_1_2 = ZoneOffset.systemDefault();
ZoneId zoneId_1_3 = TimeZone.getDefault().toZoneId();

// 1.2 獲取 東八區 的 ZoneId,以下幾個方法都是等價的
ZoneId zoneId_2_1 = ZoneId.of("UTC+8");
ZoneId zoneId_2_2 = ZoneId.of("UTC+08");
ZoneId zoneId_2_3 = ZoneId.of("UTC+08:00");
ZoneId zoneId_2_4 = ZoneId.of("Etc/GMT-8");
ZoneId zoneId_2_5 = ZoneId.of("UT+8");
ZoneId zoneId_2_6 = ZoneId.of("UT+08");
ZoneId zoneId_2_7 = ZoneId.of("UT+08:00");
System.out.println("1.2 ZoneId 7 : " + zoneId_2_7); // 輸出 UT+08:00
ZoneId zoneId_2_8 = ZoneId.of("+8");
ZoneId zoneId_2_9 = ZoneId.of("+08");
ZoneId zoneId_2_10 = ZoneId.of("+08:00");
System.out.println("1.2 ZoneId 10 : " + zoneId_2_10); // 輸出 +08:00
ZoneOffset zoneOffset_2_11 = ZoneOffset.of("+8");
System.out.println("1.2 ZoneId 11 : " + zoneOffset_2_11); // 輸出 +08:00
ZoneOffset zoneOffset_2_12 = ZoneOffset.ofHours(8);
System.out.println("1.2 ZoneId 12 : " + zoneOffset_2_12); // 輸出 +08:00

// 1.3 獲取固定城市的時區
ZoneId zoneId_3_1 = ZoneId.of("Asia/Shanghai"); // 上海
System.out.println("1.3 ZoneId 1 : " + zoneId_3_1); // 輸出 Asia/Shanghai
ZoneId zoneId_3_2 = ZoneId.of("Asia/Chongqing"); // 重慶
ZoneId zoneId_3_3 = ZoneId.of("Asia/Chungking"); // 重慶
ZoneId zoneId_3_4 = ZoneId.of("Asia/Hong_Kong"); // 香港

// 1.4 常量
ZoneOffset zoneOffsetMax = ZoneOffset.MAX;
System.out.println("1.4 ZoneId MAX : " + zoneOffsetMax); // 輸出 +18:00
ZoneOffset zoneOffsetMin = ZoneOffset.MIN;
System.out.println("1.4 ZoneId MIN : " + zoneOffsetMin); // 輸出 -18:00
ZoneOffset zoneOffsetUtc = ZoneOffset.UTC;
System.out.println("1.4 ZoneId UTC : " + zoneOffsetUtc); // 輸出 Z

// 1.5 ZoneOffset 和 ZoneId 的互相轉換
ZoneOffset zoneOffset_1_5 = ZoneOffset.ofHours(7);
ZoneId zoneId_1_5 = zoneOffset_1_5.normalized();
System.out.println("1.5 ZoneId : " + zoneId_1_5); // 輸出 +07:00

二 Period

Period 是代表年月日級別的時間區間。

// 2.1 區間為 0 年,0 月,0 日的常量物件
Period periodZero = Period.ZERO;
System.out.println("2.1 Period Zero : " + periodZero); // 輸出 P0D

// 2.2 建立一個 1 年,2 月,3 日的 Period 物件
Period period_2 = Period.of(1, 2, 3);
System.out.println("2.2 Period : " + period_2); // 輸出 P1Y2M3D

// 2.3 獲取 Period 年數
long periodYear = period_2.get(ChronoUnit.YEARS);
System.out.println("2.3 Period Year : " + periodYear); // 輸出 1

// 2.4 獲取 Period 月數
long periodMonth = period_2.get(ChronoUnit.MONTHS);
System.out.println("2.4 Period Month : " + periodMonth); // 輸出 2

// 2.5 獲取 Period 日數
long periodDay = period_2.get(ChronoUnit.DAYS);
System.out.println("2.5 Period Day : " + periodDay); // 輸出 3

三 Duration

Duration 是代表一段時間的物件。

// 3.1 持續時間為 0 的常量物件
Duration duration_1 = Duration.ZERO;
System.out.println("3.1 Duration : " + duration_1); // 輸出 PT0S

// 3.2 持續時間 1 分鐘
Duration duration_2 = Duration.of(1, ChronoUnit.SECONDS);
System.out.println("3.2 Duration : " + duration_2); // 輸出 PT1S

// 3.3 持續時間 1 天
Duration duration_3 = ChronoUnit.DAYS.getDuration();
System.out.println("3.3 Duration : " + duration_3); // 輸出 PT24H
long seconds = duration_3.getSeconds();
System.out.println("3.3 Duration Second : " + seconds); // 輸出 86400

// 3.4 持續時間 1 年
Duration duration_4 = ChronoUnit.YEARS.getDuration();
System.out.println("3.4 Duration : " + duration_4); // 輸出 PT8765H49M12S
long durationSecond = duration_4.getSeconds();
System.out.println("3.4 Duration Second: " + durationSecond); // 輸出 31556952

// 3.5 時間區間的疊加
// 建立一個 1 秒的間隔物件,再疊加上一個 1 秒的間隔物件,獲得一個代表 2 秒間隔的物件
Duration duration_5 = Duration.of(1, ChronoUnit.SECONDS);
System.out.println("3.5 Duration : " + duration_5); // 輸出 PT1S
Duration durationDouble = duration_5.plus(duration_5);
System.out.println("3.5 Duration Double : " + durationDouble); // 輸出 PT2S

// 3.6 時間區間的相除
// 建立一個 1 分支的間隔物件,將其除以 2,獲得一個代表 30 秒間隔的物件
Duration duration_6 = Duration.of(1, ChronoUnit.MINUTES);
Duration durationDivide = duration_6.dividedBy(2);
System.out.println("3.6 Duration Divide : " + durationDivide); // 輸出 PT30S

四 LocalDate

LocalDate 代表日期。

// 4.1 建立 LocalDate 為 2022 年 1 月的第一天
LocalDate localDate_1 = LocalDate.of(2022, 1, 1);
System.out.println("4.1 LocalDate : " + localDate_1); // 輸出 2022-01-01

// 4.2 建立 LocalDate 為 2022 年 7 月的第一天
LocalDate localDate_2 = LocalDate.of(2022, Month.JULY, 1);
System.out.println("4.2 LocalDate : " + localDate_2); // 輸出 2022-07-01

// 4.3 建立 LocalDate 為 2022 年的第 100 天
LocalDate localDate_3 = LocalDate.ofYearDay(2022, 100);
System.out.println("4.3 LocalDate : " + localDate_3); // 輸出 2022-04-10

// 4.4 LocalDate 常量
LocalDate localDateEpoch = LocalDate.EPOCH;
System.out.println("4.4 LocalDate EPOCH : " + localDateEpoch); // 輸出 1970-01-01
LocalDate localDateMax = LocalDate.MAX;
System.out.println("4.4 LocalDate MAX : " + localDateMax); // 輸出 +999999999-12-31
LocalDate localDateMin = LocalDate.MIN;
System.out.println("4.4 LocalDate MIn : " + localDateMin); // 輸出 -999999999-01-01

// 4.5 epoch day 指的是基於 1970-01-01 過去的日期
// 此例子中輸出的日期是 1970-1-1 + 1000天 的日子
LocalDate localDate_5 = LocalDate.ofEpochDay(1000);
System.out.println("4.5 LocalDate : " + localDate_5); // 輸出 1972-09-27

// 4.6 將字串解析成 LocalDate
DateTimeFormatter localDateFormatter_6 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault());
LocalDate localDate_6 = LocalDate.parse("2022-01-01", localDateFormatter_6);
System.out.println("4.6 LocalDate : " + localDate_6); // 輸出 2022-01-01

// 4.7 當前系統時間
LocalDate localDate_7 = LocalDate.now();
System.out.println("4.7 LocalDate : " + localDate_7); // 輸出當前系統時間

// 4.8 LocalDate 獲取年月日等基本資訊
LocalDate localDate_8 = LocalDate.of(2022, 1, 1);
System.out.println("4.8 LocalDate : " + localDate_8); // 輸出 2022-01-01

LocalDate localDate_8_1 = LocalDate.from(localDate_2);
System.out.println("4.8 LocalDate 1 : " + localDate_8_1); // 輸出 2022-01-01

int localDateDayOfYear = localDate_2.get(ChronoField.DAY_OF_YEAR);
System.out.println("4.8 LocalDate DayOfYear : " + localDateDayOfYear); // 輸出 1

int localDateDayOfYear_2 = localDate_2.getDayOfYear();
System.out.println("4.8 LocalDate DayOfYear 2 : " + localDateDayOfYear_2); // 輸出 1

int localDateYear = localDate_2.get(ChronoField.YEAR);
System.out.println("4.8 LocalDate Year : " + localDateYear); // 輸出 2022

int localDateYear_2 = localDate_2.getYear();
System.out.println("4.8 LocalDate Year 2 : " + localDateYear_2); // 輸出 2022

int localDateDayOfWeek = localDate_2.get(ChronoField.DAY_OF_WEEK);
System.out.println("4.8 LocalDate DayOfWeek : " + localDateDayOfWeek); // 輸出 6

DayOfWeek localDateDayOfWeek_2 = localDate_2.getDayOfWeek();
System.out.println("4.8 LocalDate DayOfWeek 2 : " + localDateDayOfWeek_2); // 輸出 SATURDAY

int localDateDayOfWeek_3 = localDateDayOfWeek_2.getValue();
System.out.println("4.8 LocalDate DayOfWeek 3 : " + localDateDayOfWeek_3); // 輸出 6

// 4.9 LocalDate 轉換格式
LocalDateTime localDateOfTime = LocalDateTime.of(2022, 2, 2, 1, 1, 1);
// 此處將 localDate_4_2 (LocalDate 型別) 轉換成 LocalDateTime 型別
// 注意,只有低精度可以轉換成高精度,高精度是不可以轉換成低精度的,會報錯
// 比如:LocalDateTime 型別的精度比 LocalDate 型別高,不能轉換,反之可以
Temporal temporal_9 = localDate_2.adjustInto(localDateOfTime);
System.out.println("4.9 LocalDate AdjustInto LocalDateTime : " + temporal_9); // 輸出 2022-01-01T01:01:01

五 LocalDateTime

LocalDateTime 代表日期和時間,LocalDateTime 的 Api 大部分和 LocalDate 類似。

// 5.1 LocalDateTime 建立方法,年月日時分秒
LocalDateTime localDateTime_1 = LocalDateTime.of(2022, 1, 1, 1, 1, 1);
System.out.println("5.1 LocalDateTime : " + localDateTime_1); // 輸出 2022-01-01T01:01:01

// 5.2 LocalDateTime 的增減
// 增加一天
LocalDateTime localDateTime_2_1 = localDateTime_1.plus(1, ChronoUnit.DAYS);
System.out.println("5.2 LocalDateTime Plus : " + localDateTime_2_1); // 輸出 2022-01-02T01:01:01
// 減少一天
LocalDateTime localDateTime_2_2 = localDateTime_1.minus(1, ChronoUnit.DAYS);
System.out.println("5.2 LocalDateTime Minus : " + localDateTime_2_2); // 輸出 2021-12-31T01:01:01

// 5.3 LocalDateTime 轉 LocalDate 或者 LocalTime
LocalTime localDateTimeToTime = localDateTime_1.toLocalTime();
System.out.println("5.3 LocalDateTime ToTime : " + localDateTimeToTime); // 輸出 01:01:01
LocalDate localDateTimeToDate = localDateTime_1.toLocalDate();
System.out.println("5.3 LocalDateTime ToDate : " + localDateTimeToDate); // 輸出 2022-01-01

// 5.4 當前系統時間
LocalDateTime localDateTime_4 = LocalDateTime.now();
System.out.println("5.4 LocalDateTime : " + localDateTime_4); // 輸出當前系統時間

// 5.5 使用 Instant 來生成一個 LocalDateTime
Instant now = Instant.now();
LocalDateTime localDateTime_5 = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
System.out.println("5.3 LocalDateTime : " + localDateTime_5); // 輸出當前系統時間

// 5.6 LocalDateTime 常量
LocalDateTime localDateTimeMax = LocalDateTime.MAX;
System.out.println("5.6 LocalDateTime MAX : " + localDateTimeMax); // 輸出 +999999999-12-31T23:59:59.999999999
LocalDateTime localDateTimeMin = LocalDateTime.MIN;
System.out.println("5.6 LocalDateTime MIn : " + localDateTimeMin); // 輸出 -999999999-01-01T00:00

// 5.7 根據秒和納秒來建立 LocalDateTime
LocalDateTime localDateTime_7 = LocalDateTime.ofEpochSecond(10000, 1000, ZoneOffset.of("+8"));
System.out.println("5.5 LocalDateTime OfEpochSecond : " + localDateTime_7);

六 Instant

Instant 和 Date 很類似,都代表一個時間點。

// 6.1 將一個時間戳(毫秒級)轉換成一個 Instant 物件
Instant instant_1 = Instant.ofEpochMilli(1000000L);
System.out.println("6.1 Instant : " + instant_1); // 輸出 1970-01-01T00:16:40Z

// 6.2 Instant 轉時間戳(毫秒)
long epochMilli = instant_1.toEpochMilli();
System.out.println("6.2 Instant EpochMilli : " + epochMilli); // 輸出 1000000

// 6.3 Instant 轉時間戳(秒)
long epochSecond = instant_1.getEpochSecond();
System.out.println("6.3 Instant EpochSecond : " + epochSecond); // 輸出 1000

// 6.4 時間的比較
Instant instant_4 = Instant.ofEpochMilli(10000000000L);
boolean after = instant_1.isAfter(instant_4);
System.out.println("6.4 Instant isAfter : " + after); // 輸出 false
boolean before = instant_1.isBefore(instant_4);
System.out.println("6.4 Instant isBefore : " + before); // 輸出 true

// 6.5 獲取納秒數
int nano = instant_1.getNano();
System.out.println("6.4 Instant Nano : " + nano); // 輸出 0


// 6.6 將一個時間戳(秒級)轉換成一個 Instant 物件
Instant instant_6 = Instant.ofEpochSecond(1000L);
System.out.println("6.6 Instant : " + instant_6); // 輸出 1970-01-01T00:16:40Z

// 6.7 將一個字串轉換成 Instant 物件
// 注意,此處的字串格式是固定的
Instant instant_7 = Instant.parse("2007-12-03T10:15:30.00Z");
System.out.println("6.7 Instant : " + instant_7); // 輸出 2007-12-03T10:15:30.00Z

// 6.8 常量
Instant instant_8_1 = Instant.MAX;
System.out.println("6.8 Instant MAX : " + instant_8_1); // 輸出 +1000000000-12-31T23:59:59.999999999Z
Instant instant_8_2 = Instant.MIN;
System.out.println("6.8 Instant MIN : " + instant_8_2); // 輸出 -1000000000-01-01T00:00:00Z
Instant instant_8_3 = Instant.EPOCH;
System.out.println("6.8 Instant EPOCH : " + instant_8_3); // 輸出 1970-01-01T00:00:00Z

// 6.9 當前系統時間
Instant instant_9 = Instant.now();
System.out.println("6.9 Instant NOW : " + instant_9); // 輸出當前系統時間

七 Clock

Clock 是用來獲取時間戳的一個工具類。
相對於 System.currentTimeMillis() 方法,Clock 可以定製特定的時區,更加靈活。

// 7.1 獲取一個當前系統的時間例項
Clock clock_1 = Clock.systemDefaultZone();
System.out.println("7.1 Clock SystemDefaultZone : " + clock_1); // 輸出 SystemClock[Asia/Shanghai]
// 7.2 獲取這個 clock 的時區
ZoneId clockZone = clock_1.getZone();
System.out.println("7.2 Clock Zone : " + clockZone); // 輸出 Asia/Shanghai
// 7.3 獲取當前時間戳
long clockMillis = clock_1.millis();
System.out.println("7.3 Clock Millis : " + clockMillis); // 輸出系統當前時間戳
// 7.4 獲取當前時間的 Instant
Instant clockInstant = clock_1.instant();
System.out.println("7.4 Clock Instant : " + clockInstant); // 輸出 2022-07-14T03:24:37.103993Z
// 7.5 這類似一個複製功能,複製一個具體某個時區的 Clock 物件
Clock utc10Clock = clock_1.withZone(ZoneId.of("UTC+10"));
System.out.println("7.5 Clock UTC+10 : " + utc10Clock); // 輸出 SystemClock[UTC+10:00]
// 7.6 獲取一個 TickClock
// TickClock 不會返回實時的系統時間,每過一個間隔的時間才會移動一次
// 此處的 TickClock 每過一秒重新整理一次
Clock tickClock = Clock.tick(Clock.systemDefaultZone(), Duration.of(1, ChronoUnit.SECONDS));

附錄 整體 Demo

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.util.Locale;
import java.util.TimeZone;

/**
 * Period / ZoneId / LocalDate / LocalDateTime / Duration / Month / DayOfWeek
 * 均來自 java.util 包
 */
public class TimeDemo {

    public static void main(String[] args) {

        /*
            1
            ZoneId 代表時區
            ZoneOffset 代表時區偏移量
            ZoneOffset 是 ZoneId 的子類
         */

        // 1.1 獲取系統時區,以下幾個方法都是等價的
        ZoneId zoneId_1_1 = ZoneId.systemDefault();
        ZoneId zoneId_1_2 = ZoneOffset.systemDefault();
        ZoneId zoneId_1_3 = TimeZone.getDefault().toZoneId();

        // 1.2 獲取 東八區 的 ZoneId,以下幾個方法都是等價的
        ZoneId zoneId_2_1 = ZoneId.of("UTC+8");
        ZoneId zoneId_2_2 = ZoneId.of("UTC+08");
        ZoneId zoneId_2_3 = ZoneId.of("UTC+08:00");
        ZoneId zoneId_2_4 = ZoneId.of("Etc/GMT-8");
        ZoneId zoneId_2_5 = ZoneId.of("UT+8");
        ZoneId zoneId_2_6 = ZoneId.of("UT+08");
        ZoneId zoneId_2_7 = ZoneId.of("UT+08:00");
        System.out.println("1.2 ZoneId 7 : " + zoneId_2_7); // 輸出 UT+08:00
        ZoneId zoneId_2_8 = ZoneId.of("+8");
        ZoneId zoneId_2_9 = ZoneId.of("+08");
        ZoneId zoneId_2_10 = ZoneId.of("+08:00");
        System.out.println("1.2 ZoneId 10 : " + zoneId_2_10); // 輸出 +08:00
        ZoneOffset zoneOffset_2_11 = ZoneOffset.of("+8");
        System.out.println("1.2 ZoneId 11 : " + zoneOffset_2_11); // 輸出 +08:00
        ZoneOffset zoneOffset_2_12 = ZoneOffset.ofHours(8);
        System.out.println("1.2 ZoneId 12 : " + zoneOffset_2_12); // 輸出 +08:00


        // 1.3 獲取固定城市的時區
        ZoneId zoneId_3_1 = ZoneId.of("Asia/Shanghai"); // 上海
        System.out.println("1.3 ZoneId 1 : " + zoneId_3_1); // 輸出 Asia/Shanghai
        ZoneId zoneId_3_2 = ZoneId.of("Asia/Chongqing"); // 重慶
        ZoneId zoneId_3_3 = ZoneId.of("Asia/Chungking"); // 重慶
        ZoneId zoneId_3_4 = ZoneId.of("Asia/Hong_Kong"); // 香港

        // 1.4 常量
        ZoneOffset zoneOffsetMax = ZoneOffset.MAX;
        System.out.println("1.4 ZoneId MAX : " + zoneOffsetMax); // 輸出 +18:00
        ZoneOffset zoneOffsetMin = ZoneOffset.MIN;
        System.out.println("1.4 ZoneId MIN : " + zoneOffsetMin); // 輸出 -18:00
        ZoneOffset zoneOffsetUtc = ZoneOffset.UTC;
        System.out.println("1.4 ZoneId UTC : " + zoneOffsetUtc); // 輸出 Z

        // 1.5 ZoneOffset 和 ZoneId 的互相轉換
        ZoneOffset zoneOffset_1_5 = ZoneOffset.ofHours(7);
        ZoneId zoneId_1_5 = zoneOffset_1_5.normalized();
        System.out.println("1.5 ZoneId : " + zoneId_1_5); // 輸出 +07:00



        /*
            2 Period
            Period 是代表年月日級別的時間區間
        */

        // 2.1 區間為 0 年,0 月,0 日的常量物件
        Period periodZero = Period.ZERO;
        System.out.println("2.1 Period Zero : " + periodZero); // 輸出 P0D

        // 2.2 建立一個 1 年,2 月,3 日的 Period 物件
        Period period_2 = Period.of(1, 2, 3);
        System.out.println("2.2 Period : " + period_2); // 輸出 P1Y2M3D

        // 2.3 獲取 Period 年數
        long periodYear = period_2.get(ChronoUnit.YEARS);
        System.out.println("2.3 Period Year : " + periodYear); // 輸出 1

        // 2.4 獲取 Period 月數
        long periodMonth = period_2.get(ChronoUnit.MONTHS);
        System.out.println("2.4 Period Month : " + periodMonth); // 輸出 2

        // 2.5 獲取 Period 日數
        long periodDay = period_2.get(ChronoUnit.DAYS);
        System.out.println("2.5 Period Day : " + periodDay); // 輸出 3


        /*
            3 Duration
            Duration 是代表一段時間的物件
        */

        // 3.1 持續時間為 0 的常量物件
        Duration duration_1 = Duration.ZERO;
        System.out.println("3.1 Duration : " + duration_1); // 輸出 PT0S

        // 3.2 持續時間 1 分鐘
        Duration duration_2 = Duration.of(1, ChronoUnit.SECONDS);
        System.out.println("3.2 Duration : " + duration_2); // 輸出 PT1S

        // 3.3 持續時間 1 天
        Duration duration_3 = ChronoUnit.DAYS.getDuration();
        System.out.println("3.3 Duration : " + duration_3); // 輸出 PT24H
        long seconds = duration_3.getSeconds();
        System.out.println("3.3 Duration Second : " + seconds); // 輸出 86400

        // 3.4 持續時間 1 年
        Duration duration_4 = ChronoUnit.YEARS.getDuration();
        System.out.println("3.4 Duration : " + duration_4); // 輸出 PT8765H49M12S
        long durationSecond = duration_4.getSeconds();
        System.out.println("3.4 Duration Second: " + durationSecond); // 輸出 31556952

        // 3.5 時間區間的疊加
        // 建立一個 1 秒的間隔物件,再疊加上一個 1 秒的間隔物件,獲得一個代表 2 秒間隔的物件
        Duration duration_5 = Duration.of(1, ChronoUnit.SECONDS);
        System.out.println("3.5 Duration : " + duration_5); // 輸出 PT1S
        Duration durationDouble = duration_5.plus(duration_5);
        System.out.println("3.5 Duration Double : " + durationDouble); // 輸出 PT2S

        // 3.6 時間區間的相除
        // 建立一個 1 分支的間隔物件,將其除以 2,獲得一個代表 30 秒間隔的物件
        Duration duration_6 = Duration.of(1, ChronoUnit.MINUTES);
        Duration durationDivide = duration_6.dividedBy(2);
        System.out.println("3.6 Duration Divide : " + durationDivide); // 輸出 PT30S


        /*
            4 LocalDate
            LocalDate 代表日期
        */
        // 4.1 建立 LocalDate 為 2022 年 1 月的第一天
        LocalDate localDate_1 = LocalDate.of(2022, 1, 1);
        System.out.println("4.1 LocalDate : " + localDate_1); // 輸出 2022-01-01

        // 4.2 建立 LocalDate 為 2022 年 7 月的第一天
        LocalDate localDate_2 = LocalDate.of(2022, Month.JULY, 1);
        System.out.println("4.2 LocalDate : " + localDate_2); // 輸出 2022-07-01

        // 4.3 建立 LocalDate 為 2022 年的第 100 天
        LocalDate localDate_3 = LocalDate.ofYearDay(2022, 100);
        System.out.println("4.3 LocalDate : " + localDate_3); // 輸出 2022-04-10

        // 4.4 LocalDate 常量
        LocalDate localDateEpoch = LocalDate.EPOCH;
        System.out.println("4.4 LocalDate EPOCH : " + localDateEpoch); // 輸出 1970-01-01
        LocalDate localDateMax = LocalDate.MAX;
        System.out.println("4.4 LocalDate MAX : " + localDateMax); // 輸出 +999999999-12-31
        LocalDate localDateMin = LocalDate.MIN;
        System.out.println("4.4 LocalDate MIn : " + localDateMin); // 輸出 -999999999-01-01

        // 4.5 epoch day 指的是基於 1970-01-01 過去的日期
        // 此例子中輸出的日期是 1970-1-1 + 1000天 的日子
        LocalDate localDate_5 = LocalDate.ofEpochDay(1000);
        System.out.println("4.5 LocalDate : " + localDate_5); // 輸出 1972-09-27

        // 4.6 將字串解析成 LocalDate
        DateTimeFormatter localDateFormatter_6 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault());
        LocalDate localDate_6 = LocalDate.parse("2022-01-01", localDateFormatter_6);
        System.out.println("4.6 LocalDate : " + localDate_6); // 輸出 2022-01-01

        // 4.7 當前系統時間
        LocalDate localDate_7 = LocalDate.now();
        System.out.println("4.7 LocalDate : " + localDate_7); // 輸出當前系統時間

        // 4.8 LocalDate 獲取年月日等基本資訊
        LocalDate localDate_8 = LocalDate.of(2022, 1, 1);
        System.out.println("4.8 LocalDate : " + localDate_8); // 輸出 2022-01-01

        LocalDate localDate_8_1 = LocalDate.from(localDate_2);
        System.out.println("4.8 LocalDate 1 : " + localDate_8_1); // 輸出 2022-01-01

        int localDateDayOfYear = localDate_2.get(ChronoField.DAY_OF_YEAR);
        System.out.println("4.8 LocalDate DayOfYear : " + localDateDayOfYear); // 輸出 1

        int localDateDayOfYear_2 = localDate_2.getDayOfYear();
        System.out.println("4.8 LocalDate DayOfYear 2 : " + localDateDayOfYear_2); // 輸出 1

        int localDateYear = localDate_2.get(ChronoField.YEAR);
        System.out.println("4.8 LocalDate Year : " + localDateYear); // 輸出 2022

        int localDateYear_2 = localDate_2.getYear();
        System.out.println("4.8 LocalDate Year 2 : " + localDateYear_2); // 輸出 2022

        int localDateDayOfWeek = localDate_2.get(ChronoField.DAY_OF_WEEK);
        System.out.println("4.8 LocalDate DayOfWeek : " + localDateDayOfWeek); // 輸出 6

        DayOfWeek localDateDayOfWeek_2 = localDate_2.getDayOfWeek();
        System.out.println("4.8 LocalDate DayOfWeek 2 : " + localDateDayOfWeek_2); // 輸出 SATURDAY

        int localDateDayOfWeek_3 = localDateDayOfWeek_2.getValue();
        System.out.println("4.8 LocalDate DayOfWeek 3 : " + localDateDayOfWeek_3); // 輸出 6

        // 4.9 LocalDate 轉換格式
        LocalDateTime localDateOfTime = LocalDateTime.of(2022, 2, 2, 1, 1, 1);
        // 此處將 localDate_4_2 (LocalDate 型別) 轉換成 LocalDateTime 型別
        // 注意,只有低精度可以轉換成高精度,高精度是不可以轉換成低精度的,會報錯
        // 比如:LocalDateTime 型別的精度比 LocalDate 型別高,不能轉換,反之可以
        Temporal temporal_9 = localDate_2.adjustInto(localDateOfTime);
        System.out.println("4.9 LocalDate AdjustInto LocalDateTime : " + temporal_9); // 輸出 2022-01-01T01:01:01


        /*
            5 LocalDateTime
            LocalDateTime 代表日期和時間
            LocalDateTime 的 Api 大部分和 LocalDate 類似
        */
        // 5.1 LocalDateTime 建立方法,年月日時分秒
        LocalDateTime localDateTime_1 = LocalDateTime.of(2022, 1, 1, 1, 1, 1);
        System.out.println("5.1 LocalDateTime : " + localDateTime_1); // 輸出 2022-01-01T01:01:01

        // 5.2 LocalDateTime 的增減
        // 增加一天
        LocalDateTime localDateTime_2_1 = localDateTime_1.plus(1, ChronoUnit.DAYS);
        System.out.println("5.2 LocalDateTime Plus : " + localDateTime_2_1); // 輸出 2022-01-02T01:01:01
        // 減少一天
        LocalDateTime localDateTime_2_2 = localDateTime_1.minus(1, ChronoUnit.DAYS);
        System.out.println("5.2 LocalDateTime Minus : " + localDateTime_2_2); // 輸出 2021-12-31T01:01:01

        // 5.3 LocalDateTime 轉 LocalDate 或者 LocalTime
        LocalTime localDateTimeToTime = localDateTime_1.toLocalTime();
        System.out.println("5.3 LocalDateTime ToTime : " + localDateTimeToTime); // 輸出 01:01:01
        LocalDate localDateTimeToDate = localDateTime_1.toLocalDate();
        System.out.println("5.3 LocalDateTime ToDate : " + localDateTimeToDate); // 輸出 2022-01-01

        // 5.4 當前系統時間
        LocalDateTime localDateTime_4 = LocalDateTime.now();
        System.out.println("5.4 LocalDateTime : " + localDateTime_4); // 輸出當前系統時間

        // 5.5 使用 Instant 來生成一個 LocalDateTime
        Instant now = Instant.now();
        LocalDateTime localDateTime_5 = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
        System.out.println("5.3 LocalDateTime : " + localDateTime_5); // 輸出當前系統時間

        // 5.6 LocalDateTime 常量
        LocalDateTime localDateTimeMax = LocalDateTime.MAX;
        System.out.println("5.6 LocalDateTime MAX : " + localDateTimeMax); // 輸出 +999999999-12-31T23:59:59.999999999
        LocalDateTime localDateTimeMin = LocalDateTime.MIN;
        System.out.println("5.6 LocalDateTime MIn : " + localDateTimeMin); // 輸出 -999999999-01-01T00:00

        // 5.7 根據秒和納秒來建立 LocalDateTime
        LocalDateTime localDateTime_7 = LocalDateTime.ofEpochSecond(10000, 1000, ZoneOffset.of("+8"));
        System.out.println("5.5 LocalDateTime OfEpochSecond : " + localDateTime_7);



        /*
            6 Instant
            Instant 代表一個時間點
        */
        // 6.1 將一個時間戳(毫秒級)轉換成一個 Instant 物件
        Instant instant_1 = Instant.ofEpochMilli(1000000L);
        System.out.println("6.1 Instant : " + instant_1); // 輸出 1970-01-01T00:16:40Z

        // 6.2 Instant 轉時間戳(毫秒)
        long epochMilli = instant_1.toEpochMilli();
        System.out.println("6.2 Instant EpochMilli : " + epochMilli); // 輸出 1000000

        // 6.3 Instant 轉時間戳(秒)
        long epochSecond = instant_1.getEpochSecond();
        System.out.println("6.3 Instant EpochSecond : " + epochSecond); // 輸出 1000

        // 6.4 時間的比較
        Instant instant_4 = Instant.ofEpochMilli(10000000000L);
        boolean after = instant_1.isAfter(instant_4);
        System.out.println("6.4 Instant isAfter : " + after); // 輸出 false
        boolean before = instant_1.isBefore(instant_4);
        System.out.println("6.4 Instant isBefore : " + before); // 輸出 true

        // 6.5 獲取納秒數
        int nano = instant_1.getNano();
        System.out.println("6.4 Instant Nano : " + nano); // 輸出 0


        // 6.6 將一個時間戳(秒級)轉換成一個 Instant 物件
        Instant instant_6 = Instant.ofEpochSecond(1000L);
        System.out.println("6.6 Instant : " + instant_6); // 輸出 1970-01-01T00:16:40Z

        // 6.7 將一個字串轉換成 Instant 物件
        // 注意,此處的字串格式是固定的
        Instant instant_7 = Instant.parse("2007-12-03T10:15:30.00Z");
        System.out.println("6.7 Instant : " + instant_7); // 輸出 2007-12-03T10:15:30.00Z

        // 6.8 常量
        Instant instant_8_1 = Instant.MAX;
        System.out.println("6.8 Instant MAX : " + instant_8_1); // 輸出 +1000000000-12-31T23:59:59.999999999Z
        Instant instant_8_2 = Instant.MIN;
        System.out.println("6.8 Instant MIN : " + instant_8_2); // 輸出 -1000000000-01-01T00:00:00Z
        Instant instant_8_3 = Instant.EPOCH;
        System.out.println("6.8 Instant EPOCH : " + instant_8_3); // 輸出 1970-01-01T00:00:00Z

        // 6.9 當前系統時間
        Instant instant_9 = Instant.now();
        System.out.println("6.9 Instant NOW : " + instant_9); // 輸出當前系統時間



        /*
            7 Clock
            Clock 是用來獲取時間戳的一個工具類
            相對於 System.currentTimeMillis() 方法,Clock 可以定製特定的時區,更加靈活
        */

        // 7.1 獲取一個當前系統的時間例項
        Clock clock_1 = Clock.systemDefaultZone();
        System.out.println("7.1 Clock SystemDefaultZone : " + clock_1); // 輸出 SystemClock[Asia/Shanghai]
        // 7.2 獲取這個 clock 的時區
        ZoneId clockZone = clock_1.getZone();
        System.out.println("7.2 Clock Zone : " + clockZone); // 輸出 Asia/Shanghai
        // 7.3 獲取當前時間戳
        long clockMillis = clock_1.millis();
        System.out.println("7.3 Clock Millis : " + clockMillis); // 輸出系統當前時間戳
        // 7.4 獲取當前時間的 Instant
        Instant clockInstant = clock_1.instant();
        System.out.println("7.4 Clock Instant : " + clockInstant); // 輸出 2022-07-14T03:24:37.103993Z
        // 7.5 這類似一個複製功能,複製一個具體某個時區的 Clock 物件
        Clock utc10Clock = clock_1.withZone(ZoneId.of("UTC+10"));
        System.out.println("7.5 Clock UTC+10 : " + utc10Clock); // 輸出 SystemClock[UTC+10:00]
        // 7.6 獲取一個 TickClock
        // TickClock 不會返回實時的系統時間,每過一個間隔的時間才會移動一次
        // 此處的 TickClock 每過一秒重新整理一次
        Clock tickClock = Clock.tick(Clock.systemDefaultZone(), Duration.of(1, ChronoUnit.SECONDS));

    }  
}

其它類和 Api 有待補充。
To Be Continue。。。

相關文章