計算兩個日期之間的每一天,其實非常簡單。關鍵在於善用 Calendar 類別的「自動欄位溢位修正」特性。
Java 的 Calendar 在欄位超出範圍時會自動進位修正:
import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;
public class DateRangeIterator {
public static void printDaysBetween(Date start, Date end) {
Calendar cal = Calendar.getInstance();
cal.setTime(start);
Calendar endCal = Calendar.getInstance();
endCal.setTime(end);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
while (!cal.after(endCal)) {
System.out.println(sdf.format(cal.getTime()));
cal.add(Calendar.DAY_OF_MONTH, 1); // 關鍵:自動處理月份/年份進位
}
}
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse("2024-01-28");
Date end = sdf.parse("2024-02-05");
printDaysBetween(start, end);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2024-01-28 2024-01-29 2024-01-30 2024-01-31 2024-02-01 2024-02-02 2024-02-03 2024-02-04 2024-02-05
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class ModernDateRange {
public static void printDaysBetween(LocalDate start, LocalDate end) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate current = start;
while (!current.isAfter(end)) {
System.out.println(current.format(fmt));
current = current.plusDays(1);
}
}
}
cal.add() 而非直接操作欄位,確保進位邏輯正確before()/after()/equals(),避免直接比較毫秒值java.time 套件(不可變、執行緒安全、API 直觀)TimeZone 或使用 ZonedDateTime掌握這個技巧,日期區間迭代不再需要手動處理「每月天數不同」、「閏年判斷」等繁瑣邏輯。