在 Java 程式開發中,日期與時間的處理是基礎且重要的技能。Java 提供了 java.util.Date、java.text.SimpleDateFormat、java.util.Calendar 等核心類別來應對各種時間相關需求。本文將系統介紹這三大類別的用法、常見操作與最佳實踐,並附上完整程式碼範例。
java.util.Date 類封裝了當前的日期與時間,精確到毫秒。它提供兩個建構子:
Date():以當前時間初始化物件。Date(long millisec):接收自 1970 年 1 月 1 日 00:00:00 GMT 起的毫秒數。建立 Date 物件後,常用方法包括 toString()、getTime()、before()、after()、compareTo() 等。
import java.util.*;
public class DateDemo {
public static void main(String[] args) {
Date now = new Date();
System.out.println("直接輸出:" + now);
System.out.println("toString():" + now.toString());
}
}
輸出格式類似 Mon Mar 28 14:30:25 CST 2016,其中 CST 代表中國標準時間(UTC+8)。
new Date(99,2,12).before(new Date(99,2,18)) 回傳 true。Comparable 介面,回傳負數、0、正數分別代表早於、等於、晚於。透過模式字串定義輸出格式,常用模式字元:
| 符號 | 意義 | 範例 |
|---|---|---|
| yyyy | 四位年份 | 2024 |
| MM | 兩位月份 | 03 |
| dd | 兩位日期 | 28 |
| HH | 24 小時制小時 | 14 |
| mm | 分鐘 | 30 |
| ss | 秒數 | 25 |
import java.util.*;
import java.text.*;
public class FormatDemo {
public static void main(String[] args) throws ParseException {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = sdf.format(now);
System.out.println("當前時間:" + formatted);
}
}
String str = "2016年03月01日 10:30:25";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
System.out.println(sdf1.format(now));
System.out.println(sdf2.format(now));
System.out.println(sdf3.format(now));
// 解析
String d = "2016-3-1 21:05:36";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = sdf.parse(d);
System.out.println(parsed);
parse() 會拋出 ParseException,必須捕捉或拋出。java.util.Date、java.text.SimpleDateFormat。SimpleDateFormat 非線程安全,多線程環境建議使用 ThreadLocal 或 Java 8 的 DateTimeFormatter。Calendar 為抽象類,透過 Calendar.getInstance() 取得預設時區/語系的實例,已初始化為當前時間。
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; // 0 代表 1 月
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.printf("當前時間:%d-%02d-%02d %02d:%02d:%02d%n",
year, month, day, hour, minute, second);
Calendar c = Calendar.getInstance();
Date date = c.getTime(); // Calendar -> Date
long millis = c.getTimeInMillis(); // 取得毫秒數
// 結合 SimpleDateFormat 輸出格式化字串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = sdf.format(date);
System.out.println("當前時間:" + formatted);
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, 10); // 10 天后
c.add(Calendar.MONTH, -1); // 1 月前
c.add(Calendar.YEAR, 1); // 1 年后
System.out.println(sdf.format(c.getTime()));
java.time 套件(LocalDateTime、ZonedDateTime、DateTimeFormatter),不可變、線程安全、API 更豐富。
