author-avatar
4/6/2020 8:17:37 PM
Рейтинг: 1

C# найти пересечение DateTime

Суть задачи вот в чем: есть DateTime с датой и временем работы работника, допустим 12.02.20 c 9:00 до 17:00, 13.02.20 c 9:00 до 17:00 и 14.02.20 c 9:00 до 17:00. Есть DateTime с временем выполнения заказа: начали делать 12.02.20 в 14:00 и закончили 14.02 в 16:30. Мне надо как-то найти время, которое работник работал над этим заказом (предполагается, что работник работал только над ним). То есть в результате мне нужно получить следующее: 12.02 с 14:00 до 17:00, 13.02 с 9:00 до 17:00, 14.02 с 9:00 до 16:30. Подскажите, пожалуйста, алгоритм как это можно сделать? Что то я не могу придумать ничего толкового.
Ответить
0
author-avatar
Рейтинг: 1
Класс для интервала public class DateTimeInterval { public DateTime Start { get; private set; } public DateTime End { get; private set; } public DateTimeInterval(DateTime start, DateTime end){ Start = start; End = end; } } Метод для получения интервалов по проекту public IEnumerable<DateTimeInterval> GetWorkIntervalsForProject(DateTimeInterval projectTime, DateTimeInterval[] employeeWorkIntervals){ foreach(var interval in employeeWorkIntervals) { DateTime start = interval.Start > projectTime.Start ? interval.Start : projectTime.Start; DateTime end = interval.End < projectTime.End ? interval.End : projectTime.End; if (end > start) yield return new DateTimeInterval(start, end); } } Как это все связать void Main() { var employeeWorkIntervals = new[] { new DateTimeInterval(new DateTime(2020, 02, 12, 9, 0, 0), new DateTime(2020, 02, 12, 17, 0, 0)), new DateTimeInterval(new DateTime(2020, 02, 13, 9, 0, 0), new DateTime(2020, 02, 13, 17, 0, 0)), new DateTimeInterval(new DateTime(2020, 02, 14, 9, 0, 0), new DateTime(2020, 02, 14, 17, 0, 0)), }; var projectInterval = new DateTimeInterval(new DateTime(2020, 02, 12, 14, 0, 0), new DateTime(2020, 02, 14, 16, 30, 0)); Console.WriteLine("Work intervals for project:"); foreach (var interval in GetWorkIntervalsForProject(projectInterval, employeeWorkIntervals)) { Console.WriteLine($"{interval.Start.ToString("dd-MM-yyyy HH:mm")} - {interval.End.ToString("dd-MM-yyyy HH:mm")}"); } } Вывод Work intervals for project: 12-02-2020 14:00 - 12-02-2020 17:00 13-02-2020 09:00 - 13-02-2020 17:00 14-02-2020 09:00 - 14-02-2020 16:30