Eri*_*ijn 2 c# datetime gaps-and-islands
我有一个DateTimes列表,我需要'反转'(缺少一个更好的词)这个列表.
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)),
};
Run Code Online (Sandbox Code Playgroud)
我需要将这个可用时间列表转换为该特定日期的阻止时间列表,但我有点卡住了.在这种情况下,我需要:
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
Run Code Online (Sandbox Code Playgroud)
有什么好主意吗?
试试这个,将你的类重命名为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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
493 次 |
最近记录: |