将日期范围拆分为多个范围

本文关键字:范围 拆分 日期 | 更新日期: 2023-09-27 18:37:18

我有一个开始日期和一个结束日期(以sql服务器日期时间格式)。我想将其分为几个范围,即几对开始和结束日期值。注意 - 我有.NET 3.5和Visual Studio 2008。

例如。S = 2005。E = 2010,区块大小 = 1 年。巴黎生成 = 2005-06, 06-07, 07-08, 08-2010

区块可以是任意天数/月数。我把代码放在一个SO帖子中,在我的主要方法之后,我得到了一些错误。发布 - 将日期范围拆分为日期范围区块

法典-

public static IEnumerable<Tuple<DateTime, DateTime>> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
{
    DateTime chunkEnd;
    while ((chunkEnd = start.AddDays(dayChunkSize)) < end)
    {
        yield return Tuple.Create(start, chunkEnd);
        start = chunkEnd;
    }
    yield return Tuple.Create(start, end);
}

我得到两个错误:

'CodeHere.csproj.ScriptMain.SplitDateRange(System.DateTime, System.DateTime, int)' 的主体不能是迭代器块,因为 'IEnumerable

和:

名称"元组"在当前上下文中不存在

将日期范围拆分为多个范围

您正在尝试使用 System.Tuple<T1, T2> ,这仅在 .NET 4 中引入。你使用的是 .NET 3.5,因此该结构不可用。我建议你创建自己的DateRange类型,它封装了一个开始和结束DateTime,然后返回一个IEnumerable<DateRange>

要么,要么升级到 .NET 4 或 4.5...

这是 .NET 3.5 的做事方式。 正如其他人所说,元组在.NET 3.5中不存在。

using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var myDateTime = new DateTime(2013, 10, 29);
            var myEndDateTime = new DateTime(2014, 10, 29);
            var result = SplitDateRange(myDateTime, myEndDateTime, 10);
            var file = new System.IO.StreamWriter("c:''dateFile.txt");
            foreach (var item in result)
            {
                file.WriteLine("StartDate: {0}, EndDate: {1}", item.StartDateTime, item.EndDateTime);
            }
            file.Close();
        }
        public static IEnumerable<SplitDateTime> SplitDateRange(DateTime start, DateTime end, int dayChunkSize)
        {
            DateTime chunkEnd;
            while ((chunkEnd = start.AddDays(dayChunkSize)) < end)
            {
                yield return new SplitDateTime(start, chunkEnd);
                start = chunkEnd;
            }
            yield return new SplitDateTime(start, end);
        }
    }
    public class SplitDateTime
    {
        public SplitDateTime(DateTime startDateTime, DateTime endDateTime)
        {
            StartDateTime = startDateTime;
            EndDateTime = endDateTime;
        }
        public DateTime StartDateTime { get; set; }
        public DateTime EndDateTime { get; set; }
    }
}