日期時間類
一.Date類(日期時間)
在Java中,Date
類是java.util包的一部分,用於表示一個特定的瞬間,精確到毫秒。然而,需要注意的是,Date
類本身並不包含任何時區資訊,它僅僅表示自“Unix紀元”(即1970年1月1日 00:00:00 GMT)以來的毫秒數。因此,當你建立一個Date
物件時,它實際上表示的是從那個時間點開始的毫秒數,而不是一個具體的日期和時間(除非在特定的上下文中解釋,比如使用SimpleDateFormat
來格式化它)。
然而,由於Date
類設計上的不足(比如它的大多數方法都已經被棄用),從Java 8開始,推薦使用新的日期時間API,即java.time包下的類,比如LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
等,這些類提供了更好的日期時間處理能力,包括時區支援、不可變性以及更好的設計。
使用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
,然後使用 SimpleDateFormat
的 parse
方法將其解析為 Date
物件。注意,如果字串的格式與 SimpleDateFormat
物件的模式不匹配,將會丟擲 ParseException
。
三.Calendar類(日曆)
Calendar類是Java中用於處理日期和時間的抽象類,它提供了許多方法來獲取和設定日期、時間以及執行日期和時間的計算操作。以下是對Calendar類的詳細介紹:
一、Calendar類概述
Calendar類是一個抽象類,不能直接例項化。要獲取Calendar物件,需要透過呼叫其靜態方法getInstance()
。這個方法會根據當前的時間和預設的時區返回一個Calendar例項,該例項預設由當前時間初始化。
二、主要功能和方法
-
獲取日期和時間
Calendar類提供了多種方法來獲取年、月、日、小時、分鐘、秒等日期和時間的具體值。例如,
get(int field)
方法透過傳入一個靜態常量(如Calendar.YEAR
、Calendar.MONTH
等)來獲取對應的值。需要注意的是,月份是從0開始的,即0代表一月,所以在獲取月份時通常需要加1。 -
設定日期和時間
可以使用
set(int field, int value)
方法來設定Calendar物件的日期和時間。這個方法接受兩個引數:第一個引數是要設定的欄位(如年、月、日等),第二個引數是要設定的值。例如,calendar.set(Calendar.YEAR, 2023)
會將年份設定為2023。 -
日期和時間的計算
Calendar類還提供了
add(int field, int amount)
方法,用於在日期和時間上新增或減少指定的時間量。例如,calendar.add(Calendar.DAY_OF_MONTH, 1)
會在當前日期上增加一天。 -
日期和時間的比較
雖然Calendar類本身沒有直接提供比較兩個日期的方法,但可以透過
getTime()
方法將Calendar物件轉換為Date物件,然後使用Date類的compareTo()
方法或equals()
方法來比較兩個日期。 -
日期和時間的格式化
雖然Calendar類本身不直接提供格式化功能,但可以將Calendar物件轉換為Date物件,然後使用
SimpleDateFormat
類來格式化日期和時間。
三、注意事項
- 月份從0開始:在使用Calendar類時,需要注意月份是從0開始的,即0代表一月,1代表二月,依此類推。
- 時區問題:Calendar類是與時區相關的,預設使用系統時區。如果需要處理不同時區的日期和時間,可以使用
TimeZone
類來設定時區。 - 執行緒安全問題: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
是一個靜態常量,用於表示十月,這樣可以避免直接使用數字可能導致的混淆。