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

Java Date 常用工具方法集錦(上):Calendar 基礎、格式化、週期計算

     編輯:Java 相關知識

整理 Java 日期時間處理高頻片段,涵蓋 Calendar 與 Date 互轉、月份天數、格式化輸出、年內週序計算、add/roll 差異,代碼即拿即用。

1. 獲取某月最大天數

Calendar cal = Calendar.getInstance();
cal.clear(); // 必須先 clear,否則繼承當前時間字段
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1); // 月份 0-based
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

2. Calendar ⇄ Date 互轉

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

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

3. 格式化輸出

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(new Date()); // 2024-05-18 14:30:00

4. 計算某日是當年第幾週

Calendar cal = Calendar.getInstance();
cal.set(2006, 8, 3); // 2006-09-03
int weekNo = cal.get(Calendar.WEEK_OF_YEAR);

5. 反推:某年第 N 週的周一日期

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.WEEK_OF_YEAR, 1);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime())); // 2006-01-02

6. add() 與 roll() 差異

cal.set(2006, 8, 3); // 9月3日
cal.add(Calendar.DATE, -4);  // 2006-08-30(跨月)
cal.roll(Calendar.DATE, -4); // 2006-09-29(本月循環,不改變月份)

結論:業務邏輯幾乎總用 add(),roll() 適用於日曆顯示類場景。

最佳實踐提醒

  • 線程不安全:SimpleDateFormat 非線程安全,多線程環境用 ThreadLocal 或 Java 8 DateTimeFormatter。
  • 月份陷阱:Calendar 月份 0-11,設值時 -1,顯示時 +1。
  • 優先遷移:新項目直接用 java.time (JSR-310),API 更清晰、不可變、線程安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved