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

时间:2013-10-29 21:20:35

标签: c# .net datetime date-range

我有一个开始日期和结束日期(以sql server datetime格式)。我想将它分成几个范围,即几对开始和结束日期值。 注意 - 我有.NET 3.5 和Visual Studio 2008。

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

块可以是任意天数/月。我把代码放在SO帖子中,在我的主要方法之后,我得到了一些错误。发布 - Split date range into date range chunks

代码 -

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

  

当前上下文中不存在名称'Tuple'

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

这是一种.NET 3.5的做事方式。正如其他人所说,Tuple在.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; }
    }
}