時間

有空發表於2024-11-17

JDK7 以前的時間相關類

全世界的時間, 有一個統一的計算標準.

格林尼治時間/格林威治時間 (Greenwich Mean Time) 簡稱 GMT. 計算核心: 地球自轉一天是 24 小時, 太陽直射時為正午 12 點. 後來發現計算誤差較大, 現在格林威治時間已經不再作為標準時間來使用了.

到了 2012 年 1 月, 取消了用了將近 130 年的迴歸制標準時間. 現在, 標準時間是由原子鐘來提供的.

原子鐘: 利用銫原子的震動的頻率計算出來的時間, 作為世界標準時間 (UTC)

銫原子每振動 9,192,631,770 次等於 1 秒鐘. 這種計算方式是非常精準的, 2000 萬年的誤差為 1 秒鐘.

中國位於東八區, 要在世界標準時間的基礎上加 8 小時.

Date 類

Date 類是一個 JDK 寫好的 Javabean 類, 用來描述時間, 精確到毫秒.

利用空參構造建立的物件, 預設表示作業系統當前時間.

利用有參構造建立的物件, 表示指定的時間.

程式示例:

import java.util.Date;

public class demo1 {
    public static void main(String[] args) {
        /*
            public Date() 建立 Date 物件, 表示當前時間
            public Date(long date) 建立 Date 物件, 表示指定時間
            public void settime(long time) 設定/修改毫秒值
            public long gettime() 獲取時間物件的毫秒值
        */

        // 1. 建立物件表示一個時間
        Date d1 = new Date();
        System.out.println(d1);

        // 2. 建立物件表示一個指定的時間
        Date d2 = new Date(0L);  // 從時間原點開始, 過了 0 毫秒的那個時間
        System.out.println(d2);

        // 3. settime 修改時間
        // 1000 毫秒 = 1 秒
        d2.setTime(1000L);
        System.out.println(d2);

        // 4. getTime 獲取當前時間的毫秒值
        long time = d2.getTime();
        System.out.println(time);
    }
}

程式示例:

import java.util.Date;
import java.util.Random;

public class demo2 {
    public static void main(String[] args) {
        /*
        需求 1: 列印時間原點開始一年之後的時間
        需求 2: 定義任意兩個 Date 物件, 比較一下哪個時間在前, 哪個時間在後
        */

        // 需求 2: 定義任意兩個 Date 物件, 比較一下哪個時間在前, 哪個時間在後

        Random r = new Random();

        // 建立兩個時間物件
        Date d1 = new Date(Math.abs(r.nextInt()));
        Date d2 = new Date(Math.abs(r.nextInt()));
        long time1 = d1.getTime();
        long time2 = d2.getTime();

        if (time1 > time2) {
            System.out.println("第一個時間在後面, 第二個時間在前面");
        } else if (time1 < time2) {
            System.out.println("第二個時間在後面, 第一個時間在前面");
        } else {
            System.out.println("表示兩個時間一樣");
        }
    }

    private static void method() {
        // 需求 1: 列印時間原點開始一年之後的時間
        // 1. 建立一個物件, 表示時間原點
        Date d1 = new Date(0L);

        // 2. 獲取 d1 時間的毫秒值
        long time = d1.getTime();

        // 3. 在這個基礎上我們要加一年的毫秒值即可
        time = time + 1000L * 60 * 60 * 24 * 365;
        // 4. 把計算之後的時間毫秒值, 再設定回 d1 當中
        d1.setTime(time);
        // 5. 列印 d1
        System.out.println(d1);
    }
}

SimpleDateFormat 類

Date 類只能按照固定的格式列印時間, 而這個格式不符合一般的閱讀習慣.

SimpleDateFormat 類的作用:

  • 格式化: 把時間變成我們喜歡的格式.

  • 解析: 把字串表示的時間變成 Date 物件.

圖片名稱

圖片名稱

圖片名稱

圖片名稱

程式示例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class demo3 {
    public static void main(String[] args) throws ParseException {
        /*
            public simpleDateFormat() 預設格式
            public simpleDateFormat(String pattern) 指定格式
            public final string format(Date date) 格式化(日期物件 ->字串)
            public Date parse(string source) 解析(字串 ->日期物件)
        */

        // 1. 定義一個字串表示時間
        String str = "2023-11-11 11:11:11";
        // 2. 利用空參構造建立simpleDateFormat物件
        // 細節:
        // 建立物件的格式要跟字串的格式完全一致
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(str);
        // 3. 列印結果
        System.out.println(date);  // Sat Nov 11 11:11:11 CST 2023
        System.out.println(date.getTime());  // 1699672271000

        System.out.println("--------------------------------------------------------");
        method1();
        System.out.println("--------------------------------------------------------");
    }

    private static void method1() {
        // 1. 利用空參構造建立 simpleDateFormat 物件, 預設格式
        SimpleDateFormat sdf1 = new SimpleDateFormat();
        Date d1 = new Date(0L);
        String str1 = sdf1.format(d1);
        System.out.println(str1);  // 1970/1/1 上午8:00

        // 2. 利用帶參構造建立simpleDateFormat物件, 指定格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String str2 = sdf2.format(d1);
        System.out.println(str2); // 1970年01月01日 08:00:00

        // 課堂練習: yyyy年MM月dd日 時:分:秒 星期
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
        String str3 = sdf3.format(d1);
        System.out.println(str3); // 1970年01月01日 08:00:00 週四
    }
}

程式示例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class demo4 {
    public static void main(String[] args) throws ParseException {
        /*
         * 假設, 你初戀的出生年月日為: 2000-11-11
         * 請用字串表示這個資料, 並將其轉換為: 2000年11月11日
         *
         * 建立一個 Date 物件表示 2000年11月11日
         * 建立一個 SimpleDateFormat 物件, 並定義格式為年月日把時間變成: 2000年11月11日
         */

        // 1. 可以透過 2000-11-11 進行解析, 解析成一個 Date 物件
        String str = "2000-11-11";
        // 2. 解析
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf1.parse(str);
        // 3. 格式化
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
        String result = sdf2.format(date);
        System.out.println(result);  // 2000年11月11日
    }
}

程式示例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class demo5 {
    public static void main(String[] args) throws ParseException {
        /*
         * 需求:
         * 秒殺活動開始時間: 2023年11月11日 0:0:0(毫秒值)
         * 秒殺活動結束時間: 2023年11月11日 0:10:0(毫秒值)
         *
         * 小賈下單並付款的時間為: 2023年11月11日 0:01:0
         * 小皮下單並付款的時間為: 2023年11月11日 0:11:0
         * 用程式碼說明這兩位同學有沒有參加上秒殺活動?
         */

        // 1. 定義字串表示三個時間
        String startstr = "2023年11月11日 0:0:0";
        String endstr = "2023年11月11日 0:10:0";
        String orderstr = "2023年11月11日 0:01:00";
        // 2. 解析上面的三個時間, 得到 Date 物件
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
        Date startDate = sdf.parse(startstr);
        Date endDate = sdf.parse(endstr);
        Date orderDate = sdf.parse(orderstr);

        // 3. 得到三個時間的毫秒值
        long startTime = startDate.getTime();
        long endTime = endDate.getTime();
        long orderTime = orderDate.getTime();

        // 4. 判斷
        if (orderTime >= startTime && orderTime <= endTime) {
            System.out.println("參加秒殺活動成功");  // 參加秒殺活動成功
        } else {
            System.out.println("參加秒殺活動失敗");
        }
    }
}

Calendar 類

圖片名稱

可以做, 但是比較麻煩.

Calendar 代表了系統當前時間的日曆物件, 可以單獨修改, 獲取時間中的年, 月, 日.

細節: Calendar 是一個抽象類, 不能直接建立物件.

獲取 Calendar 日曆類物件的方法:

圖片名稱 圖片名稱

BuddhistCalendar 是佛曆.

JapaneseImperialCalendar 是日本帝國曆.

GregorianCalendar 是格林威治日曆, 即公曆.

程式示例:

import java.util.Calendar;

public class CalendarDemo2 {
    public static void main(String[] args) {
        /*
         * public static Calendar lgetInstance() 獲取當前時間的日曆物件
         * public final Date getTime() 獲取日期物件
         * public final setTime(Date date) 給日曆設定日期物件
         * public long getTimeInMillis() 拿到時間毫秒值
         * public void setTimeInMillis(long millis) 給日曆設定時間毫秒值
         * public int get(int field) 獲取日期中的某個欄位資訊
         * public void set(int field,int value) 修改日曆的某個欄位資訊
         * public void add(int field,int amount) 為某個欄位增加/減少指定的值
         */

        // 1.獲取日曆物件
        // 細節1:Calendar是一個抽象類,不能直接new,而是透過一個靜態方法獲取到子類物件
        // 底層原理:
        // 會根據系統的不同時區來獲取不同的日曆物件,預設表示當前時間. 
        // 把會把時間中的紀元,年,月,日,時,分,秒,星期,等等的都放到一個陣列當中
        // 日 : 紀元
        // 1 : 年
        // 2 : 月
        // 3 : 一年中的第幾周
        // 4 : 一個月中的第幾周
        // 5 : 一個月中的第幾天(日期)
        // ....

        // 細節2:
        // 月份:範圍0~11 如果獲取出來的是.那麼實際上是1月. 
        // 星期:在老外的眼裡,星期日是一週中的第一天
        // 1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)
        Calendar c = Calendar.getInstance();
        System.out.println(c);
    }
}

getInstance() 原始碼:

圖片名稱

進入 createCalendar() 方法:

圖片名稱

Calendar 可以看作是一個抽象類. 它的實現, 採用了設計模式中的工廠方法.

當我們透過 Calendar.getInstance() 獲取日曆時, 預設的是返回的一個 GregorianCalendar 物件.

程式示例:

import java.util.Calendar;
import java.util.Date;

public class CalendarDemo2 {
    public static void main(String[] args) {
        /*
         * public static Calendar lgetInstance() 獲取當前時間的日曆物件
         * public final Date getTime() 獲取日期物件
         * public final setTime(Date date) 給日曆設定日期物件
         * public long getTimeInMillis() 拿到時間毫秒值
         * public void setTimeInMillis(long millis) 給日曆設定時間毫秒值
         * public int get(int field) 獲取日期中的某個欄位資訊
         * public void set(int field,int value) 修改日曆的某個欄位資訊
         * public void add(int field,int amount) 為某個欄位增加/減少指定的值
         */

        // 1.獲取日曆物件
        // 細節1:Calendar是一個抽象類,不能直接new,而是透過一個靜態方法獲取到子類物件
        // 底層原理:
        // 會根據系統的不同時區來獲取不同的日曆物件,預設表示當前時間. 
        // 把會把時間中的紀元,年,月,日,時,分,秒,星期,等等的都放到一個陣列當中
        // 日 : 紀元
        // 1 : 年
        // 2 : 月
        // 3 : 一年中的第幾周
        // 4 : 一個月中的第幾周
        // 5 : 一個月中的第幾天(日期)
        // ....  一共 17 個屬性, 所以索引最大為 16

        // 細節2:
        // 月份:範圍0~11 如果獲取出來的是.那麼實際上是1月. 
        // 星期:在老外的眼裡,星期日是一週中的第一天
        // 1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

        Calendar c = Calendar.getInstance();

        // 2.修改一下日曆代表的時間
        Date d = new Date(0L);
        c.setTime(d);
        System.out.println(c);
    }
}

程式示例:

import java.util.Calendar;
import java.util.Date;

public class CalendarDemo2 {
    public static void main(String[] args) {
        /*
         * public static Calendar lgetInstance() 獲取當前時間的日曆物件
         * public final Date getTime() 獲取日期物件
         * public final setTime(Date date) 給日曆設定日期物件
         * public long getTimeInMillis() 拿到時間毫秒值
         * public void setTimeInMillis(long millis) 給日曆設定時間毫秒值
         * public int get(int field) 獲取日期中的某個欄位資訊
         * public void set(int field,int value) 修改日曆的某個欄位資訊
         * public void add(int field,int amount) 為某個欄位增加/減少指定的值
         */

        // 1.獲取日曆物件
        // 細節1:Calendar是一個抽象類,不能直接new,而是透過一個靜態方法獲取到子類物件
        // 底層原理:
        // 會根據系統的不同時區來獲取不同的日曆物件,預設表示當前時間. 
        // 把會把時間中的紀元,年,月,日,時,分,秒,星期,等等的都放到一個陣列當中
        // 日 : 紀元
        // 1 : 年
        // 2 : 月
        // 3 : 一年中的第幾周
        // 4 : 一個月中的第幾周
        // 5 : 一個月中的第幾天(日期)
        // ....

        // 細節2:
        // 月份:範圍0~11 如果獲取出來的是.那麼實際上是1月. 
        // 星期:在老外的眼裡,星期日是一週中的第一天
        // 1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

        Calendar c = Calendar.getInstance();

        // puslic int get(int field) 取日期中的某個欄位資訊
        // public void set(int field,int value) 修改日曆的某個欄位資訊
        // public void add(int fieldint amount) 為某個欄位增加/減少指定的值

        int year = c.get(1);
        int month = c.get(2);
        int date = c.get(5);
        System.out.println(year + ", " + month + ", " + date);  // 2024, 8, 19

        Date d = new Date(0L);
        c.setTime(d);
        int year1 = c.get(1);
        int month1 = c.get(2) + 1;
        int date1 = c.get(5);
        System.out.println(year1 + ", " + month1 + ", " + date1);  // 1970, 1, 1

        // java在Calendar類中,把索引對應的數字都定義成常量,
        // 用數字當然也可以,但是容易忘記,閱讀性也很低,以後建議用常量,
        // 常量值可以進入 Calendar 類的原始碼中檢視

        int year2 = c.get(Calendar.YEAR);
        int month2 = c.get(Calendar.MONTH) + 1;
        int date2 = c.get(Calendar.DAY_OF_MONTH);
        int week2 = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(year2 + "," + month2 + "," + date2 + "," + week2);  // 1970,1,1,5
        // 最後的數字 5 表示星期四, 但是閱讀性不強, 可以將其顯示為星期四, 將該操作放在 getWeek() 中
        System.out.println(year2 + "," + month2 + "," + date2 + "," + getWeek(week2));  // 1970,1,1,星期四
    }

    // 查表法://表:容器
    // 讓資料跟索引產生對應的關係
    // 傳入對應的數字: 1 ~7//返回對應的星期
    public static String getWeek(int index) {
        // 定義一個陣列,讓漢字星期幾 跟1~7產生對應關係
        String[] arr = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        // 根據索引返回對應的星期
        return arr[index];
    }
}

程式示例:

import java.util.Calendar;

public class CalendarDemo2 {
    public static void main(String[] args) {
        /*
         * public static Calendar lgetInstance() 獲取當前時間的日曆物件
         * public final Date getTime() 獲取日期物件
         * public final setTime(Date date) 給日曆設定日期物件
         * public long getTimeInMillis() 拿到時間毫秒值
         * public void setTimeInMillis(long millis) 給日曆設定時間毫秒值
         * public int get(int field) 獲取日期中的某個欄位資訊
         * public void set(int field,int value) 修改日曆的某個欄位資訊
         * public void add(int field,int amount) 為某個欄位增加/減少指定的值
         */

        // 1.獲取日曆物件
        // 細節1:Calendar是一個抽象類,不能直接new,而是透過一個靜態方法獲取到子類物件
        // 底層原理:
        // 會根據系統的不同時區來獲取不同的日曆物件,預設表示當前時間. 
        // 把會把時間中的紀元,年,月,日,時,分,秒,星期,等等的都放到一個陣列當中
        // 日 : 紀元
        // 1 : 年
        // 2 : 月
        // 3 : 一年中的第幾周
        // 4 : 一個月中的第幾周
        // 5 : 一個月中的第幾天(日期)
        // ....

        // 細節2:
        // 月份:範圍0~11 如果獲取出來的是.那麼實際上是1月. 
        // 星期:在老外的眼裡,星期日是一週中的第一天
        // 1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

        Calendar c = Calendar.getInstance();

        // puslic int get(int field) 取日期中的某個欄位資訊
        // public void set(int field,int value) 修改日曆的某個欄位資訊
        // public void add(int fieldint amount) 為某個欄位增加/減少指定的值

        c.set(Calendar.YEAR, 2023);
        c.set(Calendar.MONTH, 8);
        c.set(Calendar.MONTH, 12);  // 月份大於11時,自動改變年份,自動向後排,此時相當於下一年的一月份
        c.set(Calendar.DAY_OF_MONTH, 10);

        // 呼叫方法在這個基礎上增加一個月
        c.add(Calendar.MONTH, -1);

        int year2 = c.get(Calendar.YEAR);
        int month2 = c.get(Calendar.MONTH) + 1;
        int date2 = c.get(Calendar.DAY_OF_MONTH);
        int week2 = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(year2 + "," + month2 + "," + date2 + "," + getWeek(week2));  // 2023,12,10,星期日
    }

    // 查表法://表:容器
    // 讓資料跟索引產生對應的關係
    // 傳入對應的數字: 1 ~7//返回對應的星期
    public static String getWeek(int index) {
        // 定義一個陣列,讓漢字星期幾 跟1~7產生對應關係
        String[] arr = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        // 根據索引返回對應的星期
        return arr[index];
    }
}

JDK8 新增的時間相關類

圖片名稱

圖片名稱

圖片名稱

全世界一共分為 24 個時區. 每一個時區內, 時間都是一樣的.

但是 Java 定義時區時不是按照東一區, 東二區這種方式去定義的.

在中國, Java 定義了不止一個時區: Asia/Shanghai, Asia/Taipei, Asia/Chongqing. 一般都用上海.

全世界範圍內, Java 一共定義了 600 個時區.

圖片名稱

點選控制檯, 點選 Ctrl + F, 可以在控制檯輸出的內容中進行搜尋.

程式示例:

import java.time.ZoneId;
import java.util.Set;

public class demo1 {
    public static void main(String[] args) {
        /*
        static Set<string> getAvailableZoneIds() 獲取Java中支援的所有時區
        static ZoneId systemDefault() 獲取系統預設時區
        static Zoneld of(string zoneld) 獲取一個指定時區
        */

        // 1.獲取所有的時區名稱
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();
        System.out.println(zoneIds.size());  // 600
        System.out.println(zoneIds);  // Asia/Shanghai

        // 2.獲取當前系統的預設時區
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId);  // Asia/Shanghai

        // 3.獲取指定的時區
        ZoneId zoneId1 = ZoneId.of("Asia/Pontianak");
        System.out.println(zoneId1);  // Asia/Pontianak
    }
}
圖片名稱

程式示例:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class demo2 {
    public static void main(String[] args) {
        /*
         * static Instant now() 獲取當前時間的Instant物件(標準時間)
         * static Instant ofXxxx(long epochMilli) 根據(秒/毫秒/納秒)獲取Instant物件
         * ZonedDateTime atZone(ZoneIdzone) 指定時區
         * boolean isxxx(Instant otherInstant) 判斷系列的方法
         * Instant minusXxx(long millisToSubtract) 減少時間系列的方法
         * Instant plusXxx(long millisToSubtract) 增加時間系列的方法
         */
        // 1.獲取當前時間的Instant物件(標準時間)
        Instant now = Instant.now();
        System.out.println(now);

        // 2.根據(秒/毫秒/納秒)獲取Instant物件
        Instant instant1 = Instant.ofEpochMilli(0L);
        System.out.println(instant1);// 1970-01-01T00:00:00z

        Instant instant2 = Instant.ofEpochSecond(1L);
        System.out.println(instant2);// 1970-01-01T00:00:01Z

        Instant instant3 = Instant.ofEpochSecond(1L, 1000000000L);
        System.out.println(instant3);// 1970-01-01T00:00:027

        // 3. 指定時區
        ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
        System.out.println(time);

        // 4.isXxx 判斷
        Instant instant4 = Instant.ofEpochMilli(0L);
        Instant instant5 = Instant.ofEpochMilli(1000L);

        // 5.用於時間的判斷
        // isBefore:判斷呼叫者代表的時間是否在參數列示時間的前面
        boolean result1 = instant4.isBefore(instant5);
        System.out.println(result1);// true

        // isAfter:判斷呼叫者代表的時間是否在參數列示時間的後面
        boolean result2 = instant4.isAfter(instant5);
        System.out.println(result2);// false

        // 6.Instant minusXxx(long millisToSubtract) 減少時間系列的方法
        Instant instant6 = Instant.ofEpochMilli(3000L);
        System.out.println(instant6);// 1970-01-01T00:00:03Z

        Instant instant7 = instant6.minusSeconds(1);
        System.out.println(instant7);// 1970-01-01T00:00:02Z
    }
}
圖片名稱

程式示例:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class demo3 {
    public static void main(String[] args) {
        /*
         * static ZonedDateTime now() 獲取當前時間的ZonedDateTime物件
         * static ZonedDateTime ofXxxx(. . . ) 獲取指定時間的ZonedDateTime物件
         * ZonedDateTime withXxx(時間) 修改時間系列的方法
         * ZonedDateTime minusXxx(時間) 減少時間系列的方法
         * ZonedDateTime plusXxx(時間) 增加時間系列的方法
         */
        // 1.獲取當前時間物件(帶時區)
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);

        // 2.獲取指定的時間物件(帶時區)1/年月日時分秒納秒方式指定
        ZonedDateTime time1 = ZonedDateTime.of(2023, 10, 1,
                11, 12, 12, 0, ZoneId.of("Asia/Shanghai"));
        System.out.println(time1);

        // 透過Instant + 時區的方式指定獲取時間物件
        Instant instant = Instant.ofEpochMilli(0L);
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        ZonedDateTime time2 = ZonedDateTime.ofInstant(instant, zoneId);
        System.out.println(time2);

        // 3.withXxx 修改時間系列的方法
        ZonedDateTime time3 = time2.withYear(2000);
        System.out.println(time3);

        // 4. 減少時間
        ZonedDateTime time4 = time3.minusYears(1);
        System.out.println(time4);

        // 5.增加時間
        ZonedDateTime time5 = time4.plusYears(1);
        System.out.println(time5);
    }
}
圖片名稱

程式示例:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class demo4 {
    public static void main(String[] args) {
        /*
         * static DateTimeFormatter ofPattern(格式) 獲取格式物件
         * String format(時間物件) 按照指定方式格式化
         */
        // 獲取時間物件
        ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));

        // 解析/格式化器
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm;ss EE a");
        // 格式化
        System.out.println(dtf1.format(time));
    }
}

Calendar 類

圖片名稱

圖片名稱

程式示例:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.MonthDay;

public class LocalDateDemo {
    public static void main(String[] args) {
        // 1.獲取當前時間的日曆物件(包含 年月日)
        LocalDate nowDate = LocalDate.now();
        // System.out.println("今天的日期:" + nowDate);
        // 2.獲取指定的時間的日曆物件
        LocalDate ldDate = LocalDate.of(2023, 1, 1);
        System.out.println("指定日期:" + ldDate);

        System.out.println("=============================");

        // 3.get系列方法獲取日曆中的每一個屬性值//獲取年
        int year = ldDate.getYear();
        System.out.println("year: " + year);
        // 獲取月//方式一:
        Month m = ldDate.getMonth();
        System.out.println(m);
        System.out.println(m.getValue());

        // 方式二:
        int month = ldDate.getMonthValue();
        System.out.println("month: " + month);

        // 獲取日
        int day = ldDate.getDayOfMonth();
        System.out.println("day:" + day);

        // 獲取一年的第幾天
        int dayofYear = ldDate.getDayOfYear();
        System.out.println("dayOfYear:" + dayofYear);

        // 獲取星期
        DayOfWeek dayOfWeek = ldDate.getDayOfWeek();
        System.out.println(dayOfWeek);
        System.out.println(dayOfWeek.getValue());

        // is開頭的方法表示判斷
        System.out.println(ldDate.isBefore(ldDate));
        System.out.println(ldDate.isAfter(ldDate));

        // with開頭的方法表示修改, 只能修改年月日
        LocalDate withLocalDate = ldDate.withYear(2000);
        System.out.println(withLocalDate);

        // minus開頭的方法表示減少, 只能減少年月日
        LocalDate minusLocalDate = ldDate.minusYears(1);
        System.out.println(minusLocalDate);

        // plus開頭的方法表示增加, 只能增加年月日
        LocalDate plusLocalDate = ldDate.plusDays(1);
        System.out.println(plusLocalDate);

        // -------------
        // 判斷今天是否是你的生日
        LocalDate birDate = LocalDate.of(2000, 1, 1);
        LocalDate nowDate1 = LocalDate.now();

        MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());
        MonthDay nowMd = MonthDay.from(nowDate1);

        System.out.println("今天是你的生日嗎? " + birMd.equals(nowMd));// 今天是你的生日嗎?
    }
}

程式示例:

import java.time.LocalTime;

public class LocalTimeDemo {
    public static void main(String[] args) {
        // 獲取本地時間的日曆物件. (包含 時分秒)
        LocalTime nowTime = LocalTime.now();
        System.out.println("今天的時間:" + nowTime);

        int hour = nowTime.getHour();// 時
        System.out.println("hour: " + hour);

        int minute = nowTime.getMinute();// 分
        System.out.println("minute: " + minute);

        int second = nowTime.getSecond();// 秒
        System.out.println("second:" + second);

        int nano = nowTime.getNano();// 納秒
        System.out.println("nano:" + nano);
        System.out.println("------------------------------------");
        System.out.println(LocalTime.of(8, 20));// 時分
        System.out.println(LocalTime.of(8, 20, 30));// 時分秒
        System.out.println(LocalTime.of(8, 20, 30, 150));// 時分秒納秒
        LocalTime mTime = LocalTime.of(8, 20, 30, 150);

        // is系列的方法
        System.out.println(nowTime.isBefore(mTime));
        System.out.println(nowTime.isAfter(mTime));

        // with系列的方法, 只能修改時, 分, 秒
        System.out.println(nowTime.withHour(10));

        // plus系列的方法, 只能修改時, 分, 秒
        System.out.println(nowTime.plusHours(10));
    }
}

程式示例:

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        // 當前時間的的日曆物件(包含年月日時分秒)
        LocalDateTime nowDateTime = LocalDateTime.now();

        System.out.println("今天是:" + nowDateTime);// 今天是: 
        System.out.println(nowDateTime.getYear());// 年
        System.out.println(nowDateTime.getMonthValue());// 月
        System.out.println(nowDateTime.getDayOfMonth());// 日
        System.out.println(nowDateTime.getHour());// 時
        System.out.println(nowDateTime.getMinute());// 分
        System.out.println(nowDateTime.getSecond());// 秒
        System.out.println(nowDateTime.getNano());// 納秒
        // 日:當年的第幾天
        System.out.println("dayofYear:" + nowDateTime.getDayOfYear());
        // 星期
        System.out.println(nowDateTime.getDayOfWeek());
        System.out.println(nowDateTime.getDayOfWeek().getValue());
        // 月份
        System.out.println(nowDateTime.getMonth());
        System.out.println(nowDateTime.getMonth().getValue());

        LocalDate ld = nowDateTime.toLocalDate();
        System.out.println(ld);

        LocalTime lt = nowDateTime.toLocalTime();
        System.out.println(lt.getHour());
        System.out.println(lt.getMinute());
        System.out.println(lt.getSecond());
    }
}

程式示例:

import java.time.LocalDate;
import java.time.Period;

public class PeriodDemo {
    public static void main(String[] args) {
        // 當前本地 年月日
        LocalDate today = LocalDate.now();
        System.out.println(today);

        // 生日的 年月日
        LocalDate birthDate = LocalDate.of(2000, 1, 1);
        System.out.println(birthDate);

        Period period = Period.between(birthDate, today);// 第二個引數減第一個引數

        System.out.println("相差的時間間隔物件:" + period);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());

        System.out.println(period.toTotalMonths());
    }
}

程式示例:

import java.time.Duration;
import java.time.LocalDateTime;

public class DurationDemo {
    public static void main(String[] args) {
        // 本地日期時間物件. 
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        // 出生的日期時間物件
        LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
        System.out.println(birthDate);

        Duration duration = Duration.between(birthDate, today);// 第二個引數減第一個引數
        System.out.println("相差的時間間隔物件:" + duration);

        System.out.println("============================================");
        System.out.println(duration.toDays());// 兩個時間差的天數
        System.out.println(duration.toHours());// 兩個時間差的小時數
        System.out.println(duration.toMinutes());// 兩個時間差的分鐘數
        System.out.println(duration.toMillis());// 兩個時間差的毫秒數
        System.out.println(duration.toNanos());// 兩個時間差的納秒數
    }
}

程式示例:

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class A10_ChronoUnitDemo {
    public static void main(String[] args) {
        // 當前時間
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);
        // 生日時間
        LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
        System.out.println(birthDate);

        System.out.println("相差的年數:" + ChronoUnit.YEARS.between(birthDate, today));
        System.out.println("相差的月數:" + ChronoUnit.MONTHS.between(birthDate, today));
        System.out.println("相差的週數:" + ChronoUnit.WEEKS.between(birthDate, today));
        System.out.println("相差的天數:" + ChronoUnit.DAYS.between(birthDate, today));
        System.out.println("相差的時數:" + ChronoUnit.HOURS.between(birthDate, today));
        System.out.println("相差的分數:" + ChronoUnit.MINUTES.between(birthDate, today));
        System.out.println("相差的秒數:" + ChronoUnit.SECONDS.between(birthDate, today));
        System.out.println("相差的毫秒數:" + ChronoUnit.MILLIS.between(birthDate, today));
        System.out.println("相差的微秒數:" + ChronoUnit.MICROS.between(birthDate, today));
        System.out.println("相差的納秒數:" + ChronoUnit.NANOS.between(birthDate, today));
        System.out.println("相差的半天數:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
        System.out.println("相差的十年數:" + ChronoUnit.DECADES.between(birthDate, today));
        System.out.println("相差的世紀(百年)數:" + ChronoUnit.CENTURIES.between(birthDate, today));
        System.out.println("相差的千年數:" + ChronoUnit.MILLENNIA.between(birthDate, today));
        System.out.println("相差的紀元數:" + ChronoUnit.ERAS.between(birthDate, today));
    }
}

相關文章