c# - 查找日期范围之间的差距
问题描述
我需要你的帮助。我试图弄清楚如何找到 EndDate 和下一个 StartDate 之间的差距。如果有差距,我需要返回差距所在的值。你能帮我么?
我有一个包含 StartDate 和 Enddate 的列表。例子:
- 开始日期:2/01/2021 结束日期:2/10/2021
- 开始日期:2/11/2021结束日期:2/15/2021
- 开始日期:2/20/2021结束日期:2/25/2021
1和2之间没有差距。2 (Enddate) 和 3 (Stardate) 之间是一个 Gap,需要返回如下结果:Gap found between 2/16/2021 和 2/19/2021。
我已经尝试过这个,但对我来说效果不佳,你们中的哪位可以在这里帮助我吗?
static void Main(string[] args)
{
List<DateRanges> DateRanges = new List<DateRanges>();
DateRanges.Add(new DateRanges() { StartDate = new DateTime(2021, 01, 01), EndDate = new DateTime(2021, 01, 31) });
DateRanges.Add(new DateRanges() { StartDate = new DateTime(2021, 02, 10), EndDate = new DateTime(2021, 02, 25) });
var missing = DateRangeEnumerable.GetDates(DateRanges);
var ranges = missing.GetRanges();
}
public class DateRanges
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
//public DateRanges(DateTime Start, DateTime End)
//{
// StartDate = Start;
// EndDate = End;
//}
}
public static class DateRangeEnumerable
{
public static IEnumerable<DateTime> GetDates(this IEnumerable<DateRanges> source)
{
var sortedSource = source.OrderBy(r => r.StartDate);
foreach (var range in sortedSource)
{
var d = range.StartDate;
while (d < range.EndDate)
{
yield return d;
d = d.AddDays(1);
}
}
}
public static IEnumerable<DateRanges> GetRanges(this IEnumerable<DateTime> source)
{
var sortedSource = source.OrderBy(d => d);
var enumerator = sortedSource.GetEnumerator();
if (!enumerator.MoveNext())
yield break;
DateTime from = enumerator.Current;
DateTime prev = from;
while (true)
{
while (true)
{
if (enumerator.MoveNext())
{
if (enumerator.Current == prev.AddDays(1))
prev = enumerator.Current;
else
break;
}
else
{
yield return new DateRanges() { StartDate = from, EndDate = prev.AddDays(1) };
yield break;
}
}
yield return new DateRanges() { StartDate = from, EndDate = prev.AddDays(1) };
from = enumerator.Current;
prev = enumerator.Current;
}
}
}
解决方案
示例
var dateRanges = new List<DateRanges>
{
new() {StartDate = new DateTime(2021, 2, 01), EndDate = new DateTime(2021, 2, 10)},
new() {StartDate = new DateTime(2021, 02, 11), EndDate = new DateTime(2021, 02, 15)},
new() {StartDate = new DateTime(2021, 02, 20), EndDate = new DateTime(2021, 02, 25)}
};
var end = dateRanges.First().EndDate;
foreach (var range in dateRanges.Skip(1))
{
if(end.AddDays(1) < range.StartDate )
Console.WriteLine($"{end.AddDays(1):d} - {range.StartDate.AddDays(-1):d}");
end = range.EndDate;
}
输出
16/02/2021 - 19/02/2021
免责声明:这不包含错误检查,不排序,代码中没有任何暗示,并假设日期没有时间价值。它只是复制您的描述
推荐阅读
- node.js - 在 Authy 中注册用户时避免使用电子邮件
- swift - 快速删除按钮
- html - CSS在语音气泡上添加线条
- css - 在最新的 Android Chrome (85) 上滚动时,粘性元素会消失/闪烁
- javascript - 如何在 javascript 中同步异步映射函数
- salesforce - 方法不存在或签名不正确 Database.executeBatch
- laravel - 将两个分组查询与查询生成器结合起来
- python - 如何根据每个组在列中的顺序分配值?
- mailgun - Curl 发送但 Lambda(Netlify 函数)被禁止
- c++ - 将具有不同索引起点的数组初始化为任意 N?