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

Java Date 與 Calendar 核心用法:獲取、格式化、運算完整指南

     編輯:Java 相關知識

三大核心類別職責

類別包角色狀態
Datejava.util時間戳容器(毫秒精度),大多方法已棄用舊 API,仍廣泛使用
Calendarjava.util日曆運算抽象基類,GregorianCalendar 為具體實現舊 API,功能完整
DateFormat/SimpleDateFormatjava.text日期↔字串格式化/解析,非執行緒安全舊 API,需注意併發

※ Java 8+ 建議使用 java.time 套件(LocalDateTime、DateTimeFormatter 等),不可變、執行緒安全、API 更豐富。

基礎操作範例

1. 獲取當前時間並格式化輸出


// 自定義格式
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
System.out.println(sdf.format(date)); // 例:Thursday-January-27-2005

// 標準格式(Locale 敏感)
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
System.out.println(df.format(date));  // 例:2005/1/27 上午 11:30

2. Calendar 日期運算與欄位存取


DateFormat fmt = DateFormat.getDateInstance(DateFormat.FULL);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date()); // 同步當前時間

System.out.println("系統時間: " + fmt.format(cal.getTime()));

// 設定為本週五(保持時分秒不變)
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
System.out.println("設定後: " + fmt.format(cal.getTime()));
// 若今天週三,輸出將變為本週五同一時刻

3. 常用 Calendar 欄位常數

  • YEAR、MONTH(0-11)、DAY_OF_MONTH、HOUR_OF_DAY(24制)、MINUTE、SECOND、MILLISECOND
  • DAY_OF_WEEK(SUNDAY=1 ... SATURDAY=7)
  • WEEK_OF_YEAR、WEEK_OF_MONTH

進階操作:加減時間、比較、解析


// 加減時間
cal.add(Calendar.DAY_OF_MONTH, 10);   // 10 天后
cal.add(Calendar.MONTH, -1);          // 1 月前

// 比較日期
Date d1 = cal.getTime();
Date d2 = new Date();
int cmp = d1.compareTo(d2); // -1/0/1

// 字串解析為 Date
String str = "2024-12-25 15:30:00";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = parser.parse(str); // 拋 ParseException

執行緒安全警示與最佳實踐

  • SimpleDateFormat 非執行緒安全:不可作為 static 共享欄位。解決方案:
    • 方法內部新建實例(簡單、無併發壓力)。
    • 使用 ThreadLocal<SimpleDateFormat> 快取。
    • Java 8+ 改用 DateTimeFormatter(不可變、執行緒安全)。
  • Calendar 亦非執行緒安全,避免跨線程共享實例。

Java 8+ 新時代:java.time 套件速覽


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

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

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

// 運算(不可變,返回新物件)
LocalDateTime future = now.plusDays(10).minusHours(2);

// 區間
Duration d = Duration.between(now, future);
Period p = Period.between(now.toLocalDate(), future.toLocalDate());

新 API 設計更符合直覺,強烈建議新專案採用。

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