Как получить наименьшее будущее время (после) из списка времени с текущим временем - PullRequest
0 голосов
/ 26 октября 2018

Как получить наименьшее время в будущем, после текущего времени.

Расписание времени :

06.00

12.30

17.45

Текущее время :

10.20

Время в расписании

List<TimeSpan> lstDT 

TimeSpan CurrentTimeSpan = TimeSpan.FromTicks(DateTime.Now.Ticks);

var min = lstDT
  .Select(x => new { 
     diff = Math.Abs((x - CurrentTimeSpan).Ticks), 
     time = x })
   .OrderBy(x => x.diff)
   .Last()
   .time;

Ожидаемый ответ - 12.30 (с12.30 - следующий раз после 10.20). Если текущее время - 23:59, то ожидаемый результат - 6,00.

Спасибо

1 Ответ

0 голосов
/ 26 октября 2018

Я вижу 4 проблемы с текущим кодом;мы должны

  1. избавиться от дата часть (TimeOfDay)
  2. изменить Lastв First
  3. Будьте осторожны с перерывом дня : 1:00 ближе к 23:59, чем 22:00 (мы должны проанализировать два значения:разница и разность за полночь)
  4. Поскольку мы хотим, чтобы 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;
...