You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Calendar类获取两个日期间的所有相差日期?

获取指定日期范围内所有日期的解决方案

嘿,针对你需要获取2018/05/15到2018/06/16之间所有日期的需求,我给你两种可行的实现方法——一种适配你正在使用的Calendar类,另一种是更简洁易用的Java 8+新日期API(更推荐):

方法一:基于传统Calendar类实现

既然你已经在使用Calendar,可以通过循环逐天递增的方式生成日期范围:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class DateRangeGenerator {
    public static void main(String[] args) {
        // 定义日期输出格式
        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd");
        
        // 设置起始日期:2018/05/15
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.set(2018, Calendar.MAY, 15); // 注意:Calendar的月份从0开始,MAY对应5月
        
        // 设置结束日期:2018/06/16
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.set(2018, Calendar.JUNE, 16);
        
        // 存储所有日期的列表
        List<String> dateList = new ArrayList<>();
        
        // 克隆起始日期作为当前迭代的日期,避免修改原起始日期
        Calendar currentCalendar = (Calendar) startCalendar.clone();
        
        // 循环生成日期,直到当前日期超过结束日期
        while (!currentCalendar.after(endCalendar)) {
            dateList.add(dateFormatter.format(currentCalendar.getTime()));
            currentCalendar.add(Calendar.DATE, 1); // 每天递增1天
        }
        
        // 输出结果
        for (String date : dateList) {
            System.out.println(date);
        }
    }
}

这里要特别注意:Calendar的月份是从0开始计数的,所以5月对应Calendar.MAY,6月对应Calendar.JUNE,别搞混啦。

方法二:使用Java 8+ LocalDate(推荐)

Java 8引入的java.time包是更现代、更直观的日期处理API,代码会简洁很多,也不容易出错:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class LocalDateRangeGenerator {
    public static void main(String[] args) {
        // 定义日期输出格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        
        // 设置起始和结束日期(月份直接用数字,5就是5月,直观易懂)
        LocalDate startDate = LocalDate.of(2018, 5, 15);
        LocalDate endDate = LocalDate.of(2018, 6, 16);
        
        // 生成日期列表
        List<String> dateList = new ArrayList<>();
        LocalDate currentDate = startDate;
        
        while (!currentDate.isAfter(endDate)) {
            dateList.add(currentDate.format(formatter));
            currentDate = currentDate.plusDays(1);
        }
        
        // 如果你用的是Java 9及以上,还可以用更简洁的流操作:
        // List<String> dateList = startDate.datesUntil(endDate.plusDays(1))
        //         .map(formatter::format)
        //         .toList();
        
        // 输出结果
        dateList.forEach(System.out::println);
    }
}

LocalDate的月份是直观的数字(5直接对应5月),不需要像Calendar那样做额外转换,API设计更符合日常思维,推荐优先使用这种方式。

两种方法的核心逻辑都是:从起始日期开始,逐天递增,直到到达或超过结束日期,将每个日期收集起来。

内容的提问来源于stack exchange,提问作者ManLok Wong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:33:42