首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Date 與 Calendar 類常用操作大全:建立、格式化、運算、比較與時區處理

     編輯:Java 相關知識

雖然 Java 8 java.time 已成主流,但大量存量專案仍使用 java.util.Date 與 java.util.Calendar。本文彙整兩大類**建立實例、日期格式化/解析、加減運算、比較大小、時區轉換、時間戳互轉**的高頻操作範例,並標註**執行緒安全陷阱**與**遷移建議**,兼顧維舊與新開發參考。

一、Date 類核心操作

1. 建立與時間戳互轉


Date now = new Date();                 // 當前時間
long ts = now.getTime();               // 毫秒時間戳 (1970 至今)
Date fromTs = new Date(ts);            // 時間戳還原
Date fromSec = new Date(sec * 1000L);  // 秒級時間戳轉換

2. 格式化與解析 (SimpleDateFormat)


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String str = sdf.format(now);          // Date → String
Date parsed = sdf.parse("2024-05-20 15:30:00"); // String → Date

⚠️ SimpleDateFormat 非執行緒安全,多執行緒環境請用 ThreadLocal 或每次新建。

3. 比較大小


int cmp = date1.compareTo(date2); // -1/0/1
boolean before = date1.before(date2);
boolean after = date1.after(date2);
boolean equals = date1.equals(date2); // 精確到毫秒

二、Calendar 類核心操作

1. 取得實例與常用欄位


Calendar cal = Calendar.getInstance(); // 當前時區/語系
Calendar calUTC = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar calLocale = Calendar.getInstance(Locale.TAIWAN);

int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH); // 0~11 (1月=0)
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour24 = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
int ms = cal.get(Calendar.MILLISECOND);
int dow = cal.get(Calendar.DAY_OF_WEEK); // 1=Sunday ... 7=Saturday

2. 設定與加減運算


// 設定特定日期 (年,月-1,日)
cal.set(2024, Calendar.MAY, 20, 15, 30, 0);
cal.set(Calendar.YEAR, 2025);

// 加減運算 (自動進位/借位)
cal.add(Calendar.DAY_OF_MONTH, 10);   // 加 10 天
cal.add(Calendar.MONTH, -3);          // 減 3 個月
cal.roll(Calendar.DAY_OF_MONTH, 5);   // 滾動:不改變更大欄位 (月/年)

3. 與 Date 互轉


Date date = cal.getTime();      // Calendar → Date
cal.setTime(date);              // Date → Calendar

4. 格式化輸出


SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
System.out.println(sdf.format(cal.getTime()));

三、Date/Calendar 互操作常見場景

四、執行緒安全與遷移指南

  • Date: 可變、非執行緒安全,**不要**作為靜態共享實例。
  • Calendar: 可變、非執行緒安全,**每次使用 new Instance 或 ThreadLocal**。
  • SimpleDateFormat: 可變、非執行緒安全,**ThreadLocal 或局部變數**。
  • 遷移至 java.time (Java 8+):

// 核心不可變類別:執行緒安全、API 豐富
LocalDate date = LocalDate.now();           // 日期
LocalTime time = LocalTime.now();           // 時間
LocalDateTime dt = LocalDateTime.now();     // 日期時間
ZonedDateTime zdt = ZonedDateTime.now();    // 帶時區
Instant instant = Instant.now();            // 時間戳 (UTC)

// 格式化
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = dt.format(fmt);
LocalDateTime parsed = LocalDateTime.parse(str, fmt);

// 運算
LocalDate nextWeek = date.plusWeeks(1);
Period period = Period.between(date1, date2); // 年月日差
Duration duration = Duration.between(dt1, dt2); // 時分秒差

// 舊類互轉
Date oldDate = Date.from(zdt.toInstant());
ZonedDateTime newZdt = oldDate.toInstant().atZone(ZoneId.systemDefault());

五、遷移檢核表

  • ✅ 新專案**直接使用 java.time**,拒絕 Date/Calendar。
  • ✅ 存量專案**邊界層統一轉換**(Controller/DAO),內部業務邏輯改用 java.time。
  • ✅ 資料庫驅動升級支援 getObject(rs, LocalDateTime.class) (JDBC 4.2+)。
  • ✅ 序列化傳輸採用 **ISO-8601 字串** (2024-05-20T15:30:00+08:00)。

掌握 Date/Calendar 常用操作可應對維舊需求;擁抱 java.time 則是現代 Java 開發的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求代碼片段
取得本月第一天 00:00:00cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0);
取得本月最後一天 23:59:59.999cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999);
判斷閏年cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365
計算兩日期天數差long diffDays = (date2.getTime() - date1.getTime()) / (1000*60*60*24);
時區轉換 (Date 無時區,需 Calendar)Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.setTime(date); // 現在 cal 以 UTC 解析 date 的年月日時分秒