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

Java 日期時間處理全攻略:Calendar、Date 與格式化實戰

     編輯:Java 相關知識

在 Java 8 引入全新 java.time 套件之前,java.util.Date、Calendar 與 SimpleDateFormat 是日期時間處理的主力軍。儘管舊 API 存在線程不安全、月份從 0 開始等坑點,但在大量存量專案中仍廣泛使用。本文系統整理核心用法,助你快速避坑。

核心操作速查表

1. 取得某月最大天數

Calendar cal = Calendar.getInstance();
cal.clear(); // 必須先清空,避免繼承系統當前時間殘留值
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1); // 月份 0-based
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

2. Date 與 Calendar 互轉

// Calendar -> Date
Date date = cal.getTime();

// Date -> Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

3. 格式化輸出

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 注意 HH 為 24 小時制
String formatted = sdf.format(new Date());

4. 週數計算

// 某日為當年第幾週
cal.set(2006, 8, 3); // 2006-09-03
int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);

// 某年第 N 週的周一日期
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.WEEK_OF_YEAR, 1);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(sdf.format(cal.getTime())); // 2006-01-02

5. add() vs roll() 差異

add() 會推算大月份/年份;roll() 僅在當前欄位循環(如 9 月 3 日 roll -4 天 → 8 月 29 日,而非 8 月 30 日)。

6. 精確計算兩日期間隔天數

單純用毫秒差除以 86400000 會因時間分量導致誤差(如 20:00 到隔天 08:00 算 0 天)。改進做法:

public int getDaysBetween(Calendar d1, Calendar d2) {
    if (d1.after(d2)) { Calendar tmp = d1; d1 = d2; d2 = tmp; }
    int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
    int y2 = d2.get(Calendar.YEAR);
    if (d1.get(Calendar.YEAR) != y2) {
        d1 = (Calendar) d1.clone();
        do {
            days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
            d1.add(Calendar.YEAR, 1);
        } while (d1.get(Calendar.YEAR) != y2);
    }
    return days;
}

7. 常用工具方法彙總

  • 系統當前時間字串:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
  • 字串解析為 Date:sdf.parse("2003-05-13")
  • 前一天/後一天:在毫秒基礎上 ± 86400000
  • 判斷星期幾:new SimpleDateFormat("E").format(date)

資料庫映射建議

  • Oracle DATE(無時間)→ java.sql.Date
  • SQL Server DATETIME → java.sql.Timestamp
提示:新專案強烈建議遷移至 Java 8+ java.time(LocalDateTime、ZonedDateTime、DateTimeFormatter),享受不可變、線程安全、API 清晰的現代體驗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved