C# 'invert' 日期时间列表

标签 c# datetime gaps-and-islands

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

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/

相关文章:

javascript - Sequelize 原始查询格式日期时间

c# - 如何获取下个月的天数?

sql - QUERY 查找表中日期之间的差距

sql - SQL中如何对连续记录进行分组

c# - 从命令行生成 EF 存储过程方法

c# - 从西里尔字母到拉丁字母的音译

c# - Entity Framework Core 中的一对一关系

c# - 从 ASP.NET MVC Web 应用程序访问 android Activity

sql-server-2008 - tsql DATEDIFF 在几分钟内调用而不舍入秒数

sql - 如何计算表中对象的数量,按 has_many 中的列分组,其中某些条件很重要?