在 Java 開發中,經常需要根據年份和月份動態計算該月的總天數以及跨越的週數。這在行事曆應用、排程系統、報表統計等場景中非常常見。本文將示範如何使用 java.util.Calendar 類別輕鬆完成這項任務。
Calendar 類別提供了 getActualMaximum() 方法,可根據日曆欄位返回最大可能值。我們主要使用兩個常數:
Calendar.DAY_OF_MONTH:獲取該月實際天數(28-31天)Calendar.WEEK_OF_MONTH:獲取該月跨越的週數(4-6週)import java.util.Calendar;
/**
* 功能:計算指定年月的天數與周數
* 建立時間:2024 年更新版本
*/
public class MonthCalendarCalculator {
public static void main(String[] args) {
// 獲取 Calendar 實例
Calendar calendar = Calendar.getInstance();
// 設定目標年月(月份從 0 開始,5 代表 6 月)
int targetYear = 2010;
int targetMonth = 5; // 6 月
calendar.set(Calendar.YEAR, targetYear);
calendar.set(Calendar.MONTH, targetMonth);
// 計算並輸出結果
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int weeksInMonth = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
System.out.println("------------" + targetYear + "年" + (targetMonth + 1) + "月的天數和周數-------------");
System.out.println("天數:" + daysInMonth);
System.out.println("周數:" + weeksInMonth);
}
}
以 2010 年 6 月為例,程式將輸出:
------------2010年6月的天數和周數------------- 天數:30 周數:5
若需支援使用者輸入年月,可結合 Scanner 類別讀取輸入。此外,Java 8 引入的 java.time.YearMonth 和 java.time.LocalDate 提供了更現代、線程安全的 API,建議新專案優先考慮使用新版時間 API。
Q: 為什麼月份要減 1?
A: Calendar.MONTH 欄位是 0 基礎的(0=一月,11=十二月),設定時需注意轉換。
Q: 周數計算依據是什麼?
A: 依據該月 1 號屬於第幾週,以及該月最後一天屬於第幾週,跨越的週數即為結果。