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

如何在C#中生成两个日期间的分月日期区间列表

C#实现日期区间按月拆分的方法

刚好之前做过类似的需求,给你分享一个靠谱的实现方案,完全能生成你想要的那种按月划分的日期区间列表!

核心思路

我们的目标是把给定的开始和结束日期,拆分成三类区间:

  • 第一个区间:从开始日期到当月月底
  • 中间区间:每个完整月份的1号到当月月底
  • 最后一个区间:当月1号到结束日期

然后把每个区间格式化成dd-MMM的形式(比如12-Feb、28-Feb),再拼接成“X至Y”的字符串。

完整代码实现

下面是封装好的静态类,直接就能用:

using System;
using System.Collections.Generic;
using System.Globalization;

public static class DateRangeSplitter
{
    public static IEnumerable<string> SplitDateRangeIntoMonthlyIntervals(DateTime startDate, DateTime endDate)
    {
        // 先做参数校验,避免开始日期晚于结束日期
        if (startDate > endDate)
            throw new ArgumentException("开始日期不能晚于结束日期哦!");

        var intervals = new List<string>();
        var currentDate = startDate;

        // 处理第一个月的区间
        var firstMonthEnd = new DateTime(currentDate.Year, currentDate.Month, DateTime.DaysInMonth(currentDate.Year, currentDate.Month));
        if (firstMonthEnd < endDate)
        {
            intervals.Add($"{FormatDate(currentDate)}至{FormatDate(firstMonthEnd)}");
            currentDate = firstMonthEnd.AddDays(1); // 跳到下一个月的1号
        }
        else
        {
            // 开始和结束在同一个月的情况,直接返回单个区间
            intervals.Add($"{FormatDate(startDate)}至{FormatDate(endDate)}");
            return intervals;
        }

        // 处理中间的所有完整月份
        while (currentDate.Month != endDate.Month || currentDate.Year != endDate.Year)
        {
            var monthEnd = new DateTime(currentDate.Year, currentDate.Month, DateTime.DaysInMonth(currentDate.Year, currentDate.Month));
            intervals.Add($"{FormatDate(currentDate)}至{FormatDate(monthEnd)}");
            currentDate = monthEnd.AddDays(1);
        }

        // 处理最后一个月的区间
        intervals.Add($"{FormatDate(currentDate)}至{FormatDate(endDate)}");

        return intervals;
    }

    private static string FormatDate(DateTime date)
    {
        // 使用不变文化确保月份缩写是英文(比如Feb、Mar),避免系统区域影响
        return date.ToString("dd-MMM", CultureInfo.InvariantCulture);
    }
}

使用示例

调用方法很简单,传入你的开始和结束日期就行:

// 示例日期:2月12日到5月23日
var startDate = new DateTime(2024, 2, 12);
var endDate = new DateTime(2024, 5, 23);

var monthlyIntervals = DateRangeSplitter.SplitDateRangeIntoMonthlyIntervals(startDate, endDate);

// 打印结果
foreach (var interval in monthlyIntervals)
{
    Console.WriteLine(interval);
}

运行后输出的结果就是你想要的:

12-Feb至28-Feb
1-Mar至31-Mar
1-Apr至30-Apr
1-May至23-May

一些注意事项

  • 跨年度支持:就算开始日期是2023年12月15日,结束是2024年2月20日,代码也能正确拆分出15-Dec至31-Dec、1-Jan至31-Jan、1-Feb至20-Feb
  • 格式自定义:如果需要中文月份(比如“12-二月”),可以把FormatDate方法里的CultureInfo.InvariantCulture换成CultureInfo.GetCultureInfo("zh-CN"),格式字符串改成"dd-M月"就行
  • 同月处理:如果开始和结束日期在同一个月,会直接返回单个区间,比如开始是3月5日,结束是3月10日,结果就是05-Mar至10-Mar

内容的提问来源于stack exchange,提问作者Ghalib Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:38