日期時間類

nadooo發表於2024-08-05

日期時間類

一.Date類(日期時間)

在Java中,Date 類是java.util包的一部分,用於表示一個特定的瞬間,精確到毫秒。然而,需要注意的是,Date 類本身並不包含任何時區資訊,它僅僅表示自“Unix紀元”(即1970年1月1日 00:00:00 GMT)以來的毫秒數。因此,當你建立一個Date物件時,它實際上表示的是從那個時間點開始的毫秒數,而不是一個具體的日期和時間(除非在特定的上下文中解釋,比如使用SimpleDateFormat來格式化它)。

然而,由於Date類設計上的不足(比如它的大多數方法都已經被棄用),從Java 8開始,推薦使用新的日期時間API,即java.time包下的類,比如LocalDateLocalTimeLocalDateTimeZonedDateTime等,這些類提供了更好的日期時間處理能力,包括時區支援、不可變性以及更好的設計。

使用Date

儘管Date類現在不被推薦用於新的開發,但瞭解其基本用法仍然是有益的。

import java.util.Date;  
  
public class Main {  
    public static void main(String[] args) {  
        // 建立一個Date物件,表示當前時間  
        Date now = new Date();  
          
        // 列印Date物件,預設呼叫toString()方法,顯示的是從1970年1月1日 00:00:00 GMT到現在的毫秒數  
        System.out.println("當前時間: " + now);  
          
        // 注意:由於Date類不包含時區資訊,因此上述輸出在不同的時區看起來都是一樣的,  
        // 但實際上,它表示的是自Unix紀元以來的毫秒數,在不同的時區下解釋這個值會得到不同的日期和時間。  
    }  
}

使用新的日期時間API

從Java 8開始,建議使用java.time包下的類來處理日期和時間。

import java.time.LocalDateTime;  
import java.time.format.DateTimeFormatter;  
  
public class Main {  
    public static void main(String[] args) {  
        // 獲取當前日期和時間  
        LocalDateTime now = LocalDateTime.now();  
          
        // 使用DateTimeFormatter來格式化日期時間  
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
        String formattedDateTime = now.format(formatter);  
          
        // 列印格式化後的日期時間  
        System.out.println("當前時間: " + formattedDateTime);  
    }  
}

在這個例子中,LocalDateTime 類用於獲取當前的日期和時間(不包含時區資訊),然後使用DateTimeFormatter來將日期時間格式化為字串。這種方式比使用Date類更加靈活和強大。

二.SimpleDateFormat類(格式化)

SimpleDateFormat 類是 Java 中用於格式化和解析日期的類,它屬於 java.text 包。這個類允許你進行日期-文字的轉換,即你可以將 Date 物件格式化為可讀的字串,也可以將符合特定模式的字串解析回 Date 物件。

使用 SimpleDateFormat 格式化日期

當你想要將 Date 物件轉換成一種特定格式的字串時,SimpleDateFormat 非常有用。你可以透過定義一個模式字串來指定你想要的日期時間格式。

import java.text.SimpleDateFormat;  
import java.util.Date;  
  
public class Main {  
    public static void main(String[] args) {  
        // 建立一個Date物件  
        Date date = new Date();  
  
        // 建立SimpleDateFormat物件並定義日期時間格式  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  
        // 將Date物件格式化為字串  
        String formattedDate = sdf.format(date);  
  
        // 列印格式化後的日期時間  
        System.out.println("格式化後的日期時間: " + formattedDate);  
    }  
}

在這個例子中,"yyyy-MM-dd HH:mm:ss" 是日期時間的模式字串,其中:

  • yyyy 表示四位年份
  • MM 表示兩位月份
  • dd 表示兩位日期
  • HH 表示小時(24小時制)
  • mm 表示分鐘
  • ss 表示秒

使用 SimpleDateFormat 解析日期字串

除了格式化日期外,SimpleDateFormat 還可以用來將符合特定模式的字串解析為 Date 物件。

import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
public class Main {  
    public static void main(String[] args) {  
        String dateString = "2023-10-01 12:30:45";  
  
        // 建立SimpleDateFormat物件並定義日期時間格式  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  
        try {  
            // 將字串解析為Date物件  
            Date date = sdf.parse(dateString);  
  
            // 列印解析後的Date物件(注意:這裡直接列印Date物件會顯示時間戳,為了清晰,你可以再次格式化它)  
            System.out.println("解析後的日期時間(時間戳): " + date);  
  
            // 如果你想要列印更友好的格式,可以再次使用SimpleDateFormat格式化  
            String formattedDate = sdf.format(date);  
            System.out.println("解析後的日期時間(格式化): " + formattedDate);  
  
        } catch (ParseException e) {  
            e.printStackTrace();  
            // 如果字串不符合定義的模式,將會丟擲ParseException  
        }  
    }  
}

在這個例子中,我們首先定義了一個符合 "yyyy-MM-dd HH:mm:ss" 模式的字串 dateString,然後使用 SimpleDateFormatparse 方法將其解析為 Date 物件。注意,如果字串的格式與 SimpleDateFormat 物件的模式不匹配,將會丟擲 ParseException

三.Calendar類(日曆)

Calendar類是Java中用於處理日期和時間的抽象類,它提供了許多方法來獲取和設定日期、時間以及執行日期和時間的計算操作。以下是對Calendar類的詳細介紹:

一、Calendar類概述

Calendar類是一個抽象類,不能直接例項化。要獲取Calendar物件,需要透過呼叫其靜態方法getInstance()。這個方法會根據當前的時間和預設的時區返回一個Calendar例項,該例項預設由當前時間初始化。

二、主要功能和方法

  1. 獲取日期和時間

    Calendar類提供了多種方法來獲取年、月、日、小時、分鐘、秒等日期和時間的具體值。例如,get(int field)方法透過傳入一個靜態常量(如Calendar.YEARCalendar.MONTH等)來獲取對應的值。需要注意的是,月份是從0開始的,即0代表一月,所以在獲取月份時通常需要加1。

  2. 設定日期和時間

    可以使用set(int field, int value)方法來設定Calendar物件的日期和時間。這個方法接受兩個引數:第一個引數是要設定的欄位(如年、月、日等),第二個引數是要設定的值。例如,calendar.set(Calendar.YEAR, 2023)會將年份設定為2023。

  3. 日期和時間的計算

    Calendar類還提供了add(int field, int amount)方法,用於在日期和時間上新增或減少指定的時間量。例如,calendar.add(Calendar.DAY_OF_MONTH, 1)會在當前日期上增加一天。

  4. 日期和時間的比較

    雖然Calendar類本身沒有直接提供比較兩個日期的方法,但可以透過getTime()方法將Calendar物件轉換為Date物件,然後使用Date類的compareTo()方法或equals()方法來比較兩個日期。

  5. 日期和時間的格式化

    雖然Calendar類本身不直接提供格式化功能,但可以將Calendar物件轉換為Date物件,然後使用SimpleDateFormat類來格式化日期和時間。

三、注意事項

  1. 月份從0開始:在使用Calendar類時,需要注意月份是從0開始的,即0代表一月,1代表二月,依此類推。
  2. 時區問題:Calendar類是與時區相關的,預設使用系統時區。如果需要處理不同時區的日期和時間,可以使用TimeZone類來設定時區。
  3. 執行緒安全問題:Calendar類的例項是可變的,並且不是執行緒安全的。如果在多執行緒環境中使用Calendar物件,需要採取適當的同步措施。

四、示例程式碼

以下是一個簡單的示例,展示瞭如何使用Calendar類來獲取和設定日期和時間:

import java.util.Calendar;  
  
public class CalendarExample {  
    public static void main(String[] args) {  
        // 獲取Calendar例項  
        Calendar calendar = Calendar.getInstance();  
  
        // 獲取當前年份  
        int year = calendar.get(Calendar.YEAR);  
        // 獲取當前月份(需要加1)  
        int month = calendar.get(Calendar.MONTH) + 1;  
        // 獲取當前日期  
        int date = calendar.get(Calendar.DAY_OF_MONTH);  
  
        // 列印當前日期  
        System.out.println("當前日期: " + year + "年" + month + "月" + date + "日");  
  
        // 設定日期和時間  
        calendar.set(Calendar.YEAR, 2024);  
        calendar.set(Calendar.MONTH, Calendar.OCTOBER); // 月份使用常量表示,不需要加1  
        calendar.set(Calendar.DAY_OF_MONTH, 1);  
  
        // 列印設定後的日期  
        System.out.println("設定後的日期: " + calendar.getTime());  
    }  
}

請注意,上述程式碼中的Calendar.OCTOBER是一個靜態常量,用於表示十月,這樣可以避免直接使用數字可能導致的混淆。

相關文章