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

Java Date 類別完整指南:從基礎操作到最佳實踐

     編輯:Java 相關知識

前言

java.util.Date 是 Java 處理日期時間的基礎類別,雖然 JDK 1.1 後推出 Calendar 與 DateFormat 取代其大部分方法,但理解 Date 類別運作原理仍是掌握 Java 時間處理的關鍵。本文系統整理 Date 類別的建構子、核心方法、比較操作與格式化技巧,並說明棄用方法的現代替代方案。

核心概念釐清

Date vs DateTime

Date 類別實際精確到毫秒,儲存的是相對於 GMT 1970年1月1日 00:00:00 的毫秒數。命名為 "Date" 實為歷史遺留,實際功能涵蓋日期與時間。

UTC 與 GMT

  • GMT:格林威治標準時間,天文觀測基準
  • UTC:協調世界時,原子鐘基準,更精確
  • Java 中兩者視為同一概念,但 UTC 每年可能增加「閏秒」,導致某些分鐘出現 60 或 61 秒

JSP 中的使用注意

<%@ page import="java.util.*" %>

因 java.sql 也有同名 Date 類別,建議完整寫法 java.util.Date 避免衝突。

建構子完整解析

建構子說明狀態
Date() 建立代表當前時間的 Date 物件 推薦使用
Date(long date) 依指定毫秒數(相對 GMT 1970/01/01)建立物件 推薦使用
Date(int year, int month, int date) 年(減1900)、月(0-11)、日 建立午夜時間 已棄用 → 使用 Calendar
Date(int year, int month, int date, int hrs, int min) 含時、分 已棄用 → 使用 Calendar
Date(int year, int month, int date, int hrs, int min, int sec) 含時、分、秒 已棄用 → 使用 Calendar
Date(String s) 解析字串建立物件 已棄用 → 使用 DateFormat.parse()

參數關鍵規則:

  • year:實際年份 - 1900(如 2024 年傳 124)
  • month:0=一月,11=十二月
  • date:1-31
  • hrs:0-23
  • min/sec:0-59

核心方法分類詳解

1. 字串解析與格式化(均已棄用)

舊方法現代替代方案
parse(String s) DateFormat.parse(String)
toLocaleString() DateFormat.format(Date)
toGMTString() DateFormat.format(Date) (設定 GMT TimeZone)

parse() 能解析多種格式,如 "Sat, 12 Aug 1995 13:30:00 GMT",支援時區縮寫(EST/PST 等)與偏移量(GMT+0430)。

2. 日期元件存取(均已棄用)

舊方法回傳值現代替代
getYear()年份-1900Calendar.get(Calendar.YEAR)
getMonth()0-11Calendar.get(Calendar.MONTH)
getDate()1-31Calendar.get(Calendar.DAY_OF_MONTH)
getDay()0=週日...6=週六Calendar.get(Calendar.DAY_OF_WEEK)
getHours()0-23Calendar.get(Calendar.HOUR_OF_DAY)
getMinutes()0-59Calendar.get(Calendar.MINUTE)
getSeconds()0-61(含閏秒)Calendar.get(Calendar.SECOND)

3. 日期元件設定(均已棄用)

setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds() 全部對應 Calendar.set() 相關欄位。

4. 日期比較(仍推薦使用)

方法功能回傳值
before(Date)是否早於指定日期boolean
after(Date)是否晚於指定日期boolean
equals(Object)毫秒精度相等boolean
compareTo(Date)比較先後順序int (負/0/正)

5. 毫秒數操作(核心推薦)

  • getTime():取得毫秒長整數
  • setTime(long):設定毫秒長整數
  • 這兩個方法是 Date 類別最核心、唯一未棄用的資料存取介面

6. 其他實用方法

  • clone():建立副本(Date 為可變物件,傳遞時建議 clone)
  • hashCode():基於 getTime() 計算雜湊碼
  • toString():輸出格式 "dow mon dd hh:mm:ss zzz yyyy"(如 Wed Nov 08 13:30:00 CST 2023)
  • getTimezoneOffset():取得時區偏移分鐘數(已棄用 → Calendar.ZONE_OFFSET + DST_OFFSET)

現代最佳實踐建議

Java 8+ 專案:優先使用 java.time 套件

// 當前時間
LocalDateTime now = LocalDateTime.now();

// 指定日期時間
LocalDateTime dt = LocalDateTime.of(2024, 3, 15, 14, 30, 0);

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

// 解析
LocalDateTime parsed = LocalDateTime.parse("2024-03-15 14:30:00", fmt);

// 時區處理
ZonedDateTime zdt = dt.atZone(ZoneId.of("Asia/Taipei"));

舊版專案維護:正確使用 Calendar 與 DateFormat


// 取得 Calendar 實例
Calendar cal = Calendar.getInstance();
cal.setTime(dateObj);  // 從 Date 轉換

// 設定日期
cal.set(2024, Calendar.MARCH, 15, 14, 30, 0);

// 格式化輸出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = sdf.format(cal.getTime());

常見陷阱與避坑指南

  1. Date 可變性:Date 物件內部狀態可改變,多執行緒環境下需同步或使用不可變的 java.time 類別
  2. 月份索引:Date/Calendar 月份 0-11,極易寫錯
  3. 年份偏移:Date 建構子年份需 -1900,Calendar 直接用完整年份
  4. 時區預設:無指定時區時使用 JVM 預設時區,分散式系統必須明確指定
  5. 字串解析例外:parse() 失敗拋出 ParseException,必須 try-catch

總結

雖然 java.util.Date 大部分方法已棄用,但其「毫秒長整數」核心設計延續至今。現代開發應全面遷移至 java.time 套件(Java 8+),維護舊代碼時正確使用 Calendar 與 DateFormat/SimpleDateFormat 替代棄用方法。理解 Date 類別演進歷程,有助於寫出更健壯、可維護的時間處理代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved