整理 Java 日期時間處理高頻片段,涵蓋 Calendar 與 Date 互轉、月份天數、格式化輸出、年內週序計算、add/roll 差異,代碼即拿即用。
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);
// Calendar → Date
Date date = cal.getTime();
// Date → Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(new Date()); // 2024-05-18 14:30:00
Calendar cal = Calendar.getInstance();
cal.set(2006, 8, 3); // 2006-09-03
int weekNo = cal.get(Calendar.WEEK_OF_YEAR);
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
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。java.time (JSR-310),API 更清晰、不可變、線程安全。