gpt4 book ai didi

C# 'invert' 日期时间列表

转载 作者:行者123 更新时间:2023-11-30 20:23:20 26 4
gpt4 key购买 nike

我有一个日期时间列表,我需要“反转”(因为缺少更好的词)这个列表。

public class Available
{
public Available(DateTime startDate, DateTime endDate)
{
if (!startDate.Day.Equals(endDate.Day))
throw new Exception("The start and end days are not equal.");

this.StartDate = startDate;
this.EndDate = endDate;
}

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}

List<Available> availableTimes = new List<Available>()
{
new Available(new DateTime(2015, 3, 16, 08, 00, 00), new DateTime(2015, 3, 16, 10, 00, 00)),
new Available(new DateTime(2015, 3, 16, 12, 00, 00), new DateTime(2015, 3, 16, 14, 00, 00)),
new Available(new DateTime(2015, 3, 16, 15, 00, 00), new DateTime(2015, 3, 16, 16, 00, 00)),
};

我需要将这个可用时间列表转换为特定日期的阻塞时间列表,但我有点卡住了。在这种情况下,我需要:

2015-3-16 00:00 - 2015-3-16 08:00, 
2015-3-16 10:00 - 2015-3-16 12:00,
2015-3-16 14:00 - 2015-3-16 15:00,
2015-3-16 16:00 - 2015-3-16 23:59

有什么好的想法吗?

最佳答案

试试这个,将您的类重命名为 DateTimeRange,因为它现在具有双重含义,包括已阻止,并且还必须假设 23:59 是午夜 -1 刻度。

using System;
using System.Collections.Generic;
using System.Linq;

public class DateTimeRange
{
public DateTimeRange(DateTime startDate, DateTime endDate)
{
if (!startDate.Day.Equals(endDate.Day))
throw new Exception("The start and end days are not equal.");

this.StartDate = startDate;
this.EndDate = endDate;
}

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}



public class Program
{
static List<DateTimeRange> availableTimes = new List<DateTimeRange>()
{
new DateTimeRange(new DateTime(2015, 3, 16, 08, 00, 00), new DateTime(2015, 3, 16, 10, 00, 00)),
new DateTimeRange(new DateTime(2015, 3, 16, 12, 00, 00), new DateTime(2015, 3, 16, 14, 00, 00)),
new DateTimeRange(new DateTime(2015, 3, 16, 15, 00, 00), new DateTime(2015, 3, 16, 16, 00, 00)),
};

private static IEnumerable<DateTimeRange> GetBlockedTimes(IEnumerable<DateTimeRange> ranges)
{
var min = ranges.Select(r => r.StartDate).Min().Date;
var max = ranges.Select(r => r.EndDate).Max().AddDays(1).Date.AddTicks(-1);

foreach(var range in ranges.OrderBy(r => r.StartDate))
{
yield return new DateTimeRange(min, range.StartDate);
min = range.EndDate;
}

yield return new DateTimeRange(min, max);
}

public static void Main()
{
foreach(var item in GetBlockedTimes(availableTimes))
{
Console.WriteLine(item.StartDate + " - " + item.EndDate);
}
}
}

关于C# 'invert' 日期时间列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29073718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com