如何从当前时间列表中获取最短的未来时间(从现在开始)

时间:2018-10-26 09:30:22

标签: c# .net linq datetime timespan

如何获取当前时间之后的最低未来时间。

计划时间

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(因为下一次之后 10.20为12.30)。 如果当前时间是23:59,则预期结果是6.00。

谢谢

1 个答案:

答案 0 :(得分:1)

我可以看到当前代码中的 4 个问题;我们必须

  1. 摆脱 日期部分TimeOfDay
  2. Last更改为First
  3. 请注意休息日1:0023:59更接近22:00(我们必须分析两个 值:午夜之间的差异和差异)
  4. 因为我们只希望未来,所以我们应该放弃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;