Java 舊版日期 Date 與 Calendar

在 Java 8 之前,主要使用 java.util.Datejava.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()
格式化SimpleDateFormatDateTimeFormatter
執行緒安全
不可變性可變不可變

重點整理

  • 舊版 Date 是可變的,Calendar 月份從 0 開始
  • SimpleDateFormat 不是執行緒安全的
  • Java 8+ 建議使用 java.time 套件的新 API
  • 使用 toInstant()Date.from() 進行新舊轉換
  • 維護舊程式碼時才需要使用舊版 API