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

Java 日期運算技巧:利用 Calendar 自動溢位特性計算日期區間每一天

     編輯:Java 相關知識

計算兩個日期之間的每一天,其實非常簡單。關鍵在於善用 Calendar 類別的「自動欄位溢位修正」特性。

核心原理

Java 的 Calendar 在欄位超出範圍時會自動進位修正:

  • 2000-02-28 加 1 天 → 自動變為 2000-03-01(閏年)
  • 2001-02-28 加 1 天 → 自動變為 2001-03-01(平年)
  • 12 月 31 日加 1 天 → 自動變為次年 1 月 1 日

標準迭代模式


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

進階:Java 8+ 新時間 API (更推薦)


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 8+ 專案請優先使用 java.time 套件(不可變、執行緒安全、API 直觀)
  • 時區問題:跨時區計算請明確設定 TimeZone 或使用 ZonedDateTime

掌握這個技巧,日期區間迭代不再需要手動處理「每月天數不同」、「閏年判斷」等繁瑣邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved