如何从C#中的另一个开始日期和结束日期获取按天间隔列出的所有可能期间(带有开始日期和结束日期)的列表

时间:2019-07-19 09:26:48

标签: c# date

我的开始日期是:2019年1月1日,结束日期是2019年12月31日。

我需要获取这些日期之间的所有可能时间段,但要间隔一定时间。

时间间隔可以是180、90、45、15、7和1天。

因此,如果我选择180天,则退货应为包含以下期间的列表:

  1. 2019年1月1日-2019年6月30日(生成列表的第一期)

  2. 2019年1月7日-2019年12月31日(第二个生成列表)

这几乎像Generate list of list for start and end date of week from date range 但是我需要在C#中做到这一点

How to find a list of Dates from a Start-Date and End-Date 不是我所需要的。但是很近。

DateTime startDate = DateTime.Parse("01/01/2019");
DateTime endDate = DateTime.Parse("31/12/2019");

dayInterval = 45;             

startDate = startDate.AddDays(dayInterval);
endDate = endDate.AddDays(-dayInterval);

我也尝试过:

var startDate = new DateTime(2019, 1, 1);
var endDate = new DateTime(2019, 12, 31);
int days = 45;

List<DateTime> range = Enumerable.Range(0, days)
    .Select(i => startDate.AddDays(i))
    .ToList();

3 个答案:

答案 0 :(得分:0)

也许尝试这样编写代码:

tatic IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startDate, DateTime endDate)
{
    List<DateTime> allDates = new List<DateTime>();


    for (DateTime i = startDate; i <= endDate; i = i.AddDays(45))
    {
        allDates.Add(i);
    }
    return allDates.AsReadOnly();
}

答案 1 :(得分:0)

这里提出的解决方案是我需要的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);
    }

答案 2 :(得分:0)

对于日期时间的保留期,您可以创建Period结构:

        public struct Period
        {
            public DateTime PeriodStartDate { get; set; }
            public DateTime PeriodEndDate { get; set; }

            public Period(DateTime periodStartDate, DateTime periodEndDate)
            {
                this.PeriodStartDate = periodStartDate;
                this.PeriodEndDate = periodEndDate;
            }
        }

您可以计算出给定间隔内有多少个期间,并根据该期间添加天数。这是基本算法:

            DateTime startDate = DateTime.Parse("01/01/2019");
            DateTime endDate = DateTime.Parse("31/12/2019");

            int dayInterval = 90;

            var dateDiff = (endDate - startDate).TotalDays;
            int dateRatio = (int)dateDiff / dayInterval;
            var listDates = new List<Period>();
            var lastDate = startDate;

            for (int i = 0; i < dateRatio; i++)
            {
                var offsetDay = lastDate.AddDays(dayInterval);
                listDates.Add(new Period(lastDate, offsetDay));
                lastDate = offsetDay.AddDays(1);
            }

您还可以在dateInterval变量上添加一些验证,该变量只能是180、90、45、15、7和1。最后,可以缩短算法,但是我为清楚的答案分别创建了变量。