C# 根据日期将时间范围拆分为列表

C# 根据日期将时间范围拆分为列表,c#,datetime,C#,Datetime,我有一个以开始和结束为边界的日期范围,我想得到一个范围列表,在那里原始范围被拆分为各个日期的范围。所以从1月1日到1月7日将返回7个范围,在该范围内每天一个 基本上我需要的是: var start = new DateTime(2017, 08, 05, 09, 00, 00); var end = new DateTime(2017, 08, 07, 16, 00, 00); var splittedTimeRanges = SplitDate(start, end); // splitte

我有一个以开始和结束为边界的日期范围,我想得到一个范围列表,在那里原始范围被拆分为各个日期的范围。所以从1月1日到1月7日将返回7个范围,在该范围内每天一个

基本上我需要的是:

var start = new DateTime(2017, 08, 05, 09, 00, 00);
var end = new DateTime(2017, 08, 07, 16, 00, 00);

var splittedTimeRanges = SplitDate(start, end);
// splittedTimeRanges[0]
//{05.08.2017 9:00:00 - 06.08.2017 00:00:00 | 0.15:00} 
// splittedTimeRanges[1]
//{06.08.2017 00:00:00 - 07.08.2017 00:00:00 | 0.24:00}
// splittedTimeRanges[2]
//{07.08.2017 00:00:00 - 07.08.2017 16:00:00 | 0.16:00}

我希望避免使用
Tuple
和类似的第三方库。有没有办法用简洁的代码来实现这一点?

我想这可以帮到你:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TimeSplit
{
    class Program
    {
        static void Main(string[] args)
        {
            var range = new DateRange()
            {
                Start = new DateTime(2017, 08, 05, 09, 00, 00),
                End = new DateTime(2017, 08, 07, 16, 00, 00)
            };

            foreach (var r in SplitInToDays(range))
            {
                Console.WriteLine($"{r.Start} - {r.End} - {r.Duration}");
            }
            Console.ReadLine();
        }

        public static IEnumerable<DateRange> SplitInToDays(DateRange range)
        {
            var ranges = new List<DateRange>();

            var tempRange = new DateRange() { Start = range.Start, End = range.End };

            while (tempRange.Start.Date != tempRange.End.Date)
            {
                var dateRange = new DateRange()
                {
                    Start = tempRange.Start,
                    End = tempRange.Start.Date.AddDays(1)
                };
                ranges.Add(dateRange);
                tempRange.Start = dateRange.End;
            }

            ranges.Add(tempRange);

            return ranges;
        }
    }

    public class DateRange
    {
        public DateTime Start { get; set; }
        public DateTime End { get; set; }

        public TimeSpan Duration => End - Start;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间时间分割
{
班级计划
{
静态void Main(字符串[]参数)
{
var range=new DateRange()
{
开始=新的日期时间(2017、08、05、09、00、00),
结束=新的日期时间(2017、08、07、16、00、00)
};
foreach(分为天的var(范围))
{
WriteLine($“{r.Start}-{r.End}-{r.Duration}”);
}
Console.ReadLine();
}
公共静态IEnumerable SplitInToDays(日期范围)
{
变量范围=新列表();
var tempRange=new DateRange(){Start=range.Start,End=range.End};
while(tempRange.Start.Date!=tempRange.End.Date)
{
var dateRange=new dateRange()
{
开始=临时范围。开始,
End=tempRange.Start.Date.AddDays(1)
};
范围。添加(日期范围);
tempRange.Start=dateRange.End;
}
范围。添加(临时范围);
返回范围;
}
}
公共类日期范围
{
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共时间跨度持续时间=>结束-开始;
}
}
它从传入的原始范围实例创建一个临时范围实例。然后循环,只要该范围的开始和结束日期不同。每个循环都以开始时间作为新范围的开始,并以第二天的午夜结束。然后将温度范围提前到刚创建的范围的开始和结束。一旦开始和结束在同一天,它只会添加剩下的内容

没有错误检查,因此它很容易爆炸,或者在给定错误输入值时陷入循环。我会让你自己检查

它为我生成以下输出:

2017年5月8日上午9:00:00-2017年6月8日上午12:00:00-15:00

2017年8月6日12:00:00 AM-2017年8月7日12:00:00 AM-1.00:00

2017年8月7日上午12:00:00-2017年8月7日下午4:00-16:00


这篇文章我读了好几遍,都搞不懂你想做什么。你能详细解释一下吗?当然可以。我想将定义的开始和结束的每一天拆分为时间范围列表。我需要拆分日期列表的原因是,我将每天检查时间范围是否在办公时间(9-17)的时间范围内。因此,您有一个以
开始
结束
为边界的日期范围,并且您想获得一个范围列表,将原始范围拆分回各个日期的范围?那么1月1日到1月7日将返回7个范围,在该范围内每天一个?是的,完全正确!并尊重原始的start.TimeOfDay和end.TimeOfDay。添加对原始问题的解释。如果范围结束为午夜,这将生成一个空日期范围:var range=new DateRange(){Start=new DateTime(2020,01,01,09,00,00),end=new DateTime(2020,01,02,00,00,00)};