Я вижу 4 проблемы с текущим кодом;мы должны
- избавиться от дата часть (
TimeOfDay
) - изменить
Last
в First
- Будьте осторожны с перерывом дня :
1:00
ближе к 23:59
, чем 22:00
(мы должны проанализировать два значения:разница и разность за полночь) - Поскольку мы хотим, чтобы future only, мы должны опустить
Math.Abs
(что делает прошлое и будущее равными), но поставить условие
Реализация:
List<TimeSpan> lstDT = new List<TimeSpan>() {
new TimeSpan( 6, 0, 0), // pure times, no date parts
new TimeSpan(12, 30, 0),
new TimeSpan(17, 45, 0),
};
// Test Data:
// DateTime current = new DateTime(2018, 10, 27, 11, 20, 0);
// TimeSpan CurrentTimeSpan = TimeSpan.FromTicks(current.TimeOfDay.Ticks);
// TimeOfDay - we don't want Date part, but Time only
TimeSpan CurrentTimeSpan = TimeSpan.FromTicks(DateTime.Now.TimeOfDay.Ticks);
// closest future time
var min = lstDT
.Select(x => new {
// + new TimeSpan(1, 0, 0, 0) - over the midnight
diff = x > CurrentTimeSpan
? (x - CurrentTimeSpan).Ticks
: (x - CurrentTimeSpan + new TimeSpan(1, 0, 0, 0)).Ticks,
time = x })
.OrderBy(x => x.diff)
.First() // <- First, not Last
.time;