Java 舊版日期 Date 與 Calendar
在 Java 8 之前,主要使用 java.util.Date 和 java.util.Calendar 處理日期時間。雖然 Java 8+ 建議使用新的日期時間 API,但了解舊版 API 仍然重要。
java.util.Date
建立 Date
import java.util.Date;
// 當前時間
Date now = new Date();
System.out.println(now); // Wed Dec 25 14:30:45 CST 2024
// 從毫秒數建立
Date date = new Date(1735100000000L);
// 已過時的建構子(不建議使用)
// Date date = new Date(2024, 11, 25); // 已過時
Date 常用方法
Date date = new Date();
// 取得毫秒數
long time = date.getTime();
// 設定毫秒數
date.setTime(1735100000000L);
// 比較
Date other = new Date();
boolean before = date.before(other);
boolean after = date.after(other);
int compare = date.compareTo(other);
java.util.Calendar
建立 Calendar
import java.util.Calendar;
// 取得當前時間的 Calendar
Calendar cal = Calendar.getInstance();
// 設定特定日期
Calendar cal2 = Calendar.getInstance();
cal2.set(2024, Calendar.DECEMBER, 25); // 月份從 0 開始
// 設定完整日期時間
cal2.set(2024, Calendar.DECEMBER, 25, 14, 30, 45);
取得日期資訊
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR); // 2024
int month = cal.get(Calendar.MONTH); // 11 (0-based, 12月)
int day = cal.get(Calendar.DAY_OF_MONTH); // 25
int hour = cal.get(Calendar.HOUR_OF_DAY); // 14
int minute = cal.get(Calendar.MINUTE); // 30
int second = cal.get(Calendar.SECOND); // 45
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1=週日, 7=週六
int dayOfYear = cal.get(Calendar.DAY_OF_YEAR); // 360
修改日期
Calendar cal = Calendar.getInstance();
// 設定特定欄位
cal.set(Calendar.YEAR, 2025);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
// 加減日期
cal.add(Calendar.DAY_OF_MONTH, 7); // 加 7 天
cal.add(Calendar.MONTH, -1); // 減 1 個月
cal.add(Calendar.YEAR, 1); // 加 1 年
Calendar 與 Date 轉換
Calendar cal = Calendar.getInstance();
// Calendar 轉 Date
Date date = cal.getTime();
// Date 轉 Calendar
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date);
SimpleDateFormat
import java.text.SimpleDateFormat;
// 建立格式化器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化
Date date = new Date();
String formatted = sdf.format(date); // 2024-12-25 14:30:45
// 解析
Date parsed = sdf.parse("2024-12-25 14:30:45");
注意:SimpleDateFormat 不是執行緒安全的!
新舊 API 轉換
Date ↔ Instant
// Date 轉 Instant
Date date = new Date();
Instant instant = date.toInstant();
// Instant 轉 Date
Instant now = Instant.now();
Date fromInstant = Date.from(now);
Date ↔ LocalDateTime
// Date 轉 LocalDateTime
Date date = new Date();
LocalDateTime ldt = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
// LocalDateTime 轉 Date
LocalDateTime localDateTime = LocalDateTime.now();
Date fromLdt = Date.from(
localDateTime.atZone(ZoneId.systemDefault()).toInstant()
);
Calendar ↔ ZonedDateTime
// Calendar 轉 ZonedDateTime
Calendar cal = Calendar.getInstance();
ZonedDateTime zdt = cal.toInstant().atZone(cal.getTimeZone().toZoneId());
// ZonedDateTime 轉 Calendar
ZonedDateTime zonedDateTime = ZonedDateTime.now();
Calendar fromZdt = GregorianCalendar.from(zonedDateTime);
新舊 API 比較
| 功能 | 舊 API | 新 API (Java 8+) |
|---|---|---|
| 當前日期時間 | new Date() | LocalDateTime.now() |
| 日期運算 | Calendar.add() | plusDays(), minusMonths() |
| 格式化 | SimpleDateFormat | DateTimeFormatter |
| 執行緒安全 | 否 | 是 |
| 不可變性 | 可變 | 不可變 |
重點整理
- 舊版
Date是可變的,Calendar月份從 0 開始 SimpleDateFormat不是執行緒安全的- Java 8+ 建議使用
java.time套件的新 API - 使用
toInstant()和Date.from()進行新舊轉換 - 維護舊程式碼時才需要使用舊版 API