C# 如何从当前时间的时间列表中获取最低未来时间(现在之后)

C# 如何从当前时间的时间列表中获取最低未来时间(现在之后),c#,.net,linq,datetime,timespan,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)

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

计划时间

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;
列表lstDT
TimeSpan CurrentTimeSpan=TimeSpan.FromTicks(DateTime.Now.Ticks);
var最小值=lstDT
.Select(x=>new{
diff=Math.Abs((x-CurrentTimeSpan).Ticks),
时间=x})
.OrderBy(x=>x.diff)
.Last()
时间
预期答案为12.30(因为12.30是10.20之后的下一次)。 如果当前时间为23:59,则预期结果为6.00


谢谢

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

  • 去掉日期部分(
    TimeOfDay
  • Last
    更改为
    First
  • 注意白天休息:
    1:00
    22:00
    更接近
    23:59
    (我们必须分析两个值:差值和午夜的差值)
  • 既然我们只想要未来,我们就应该放弃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;
    
    List lstDT=新列表(){
    新TimeSpan(6,0,0),//纯时间,无日期部分
    新的时间跨度(12,30,0),
    新的时间跨度(17,45,0),
    };
    //测试数据:
    //当前日期时间=新的日期时间(2018,10,27,11,20,0);
    //TimeSpan CurrentTimeSpan=TimeSpan.FromTicks(当前.TimeOfDay.Ticks);
    //时间-我们不需要日期部分,只需要时间
    TimeSpan CurrentTimeSpan=TimeSpan.FromTicks(DateTime.Now.TimeOfDay.Ticks);
    //最近未来时间
    var最小值=lstDT
    .选择(x=>new{
    //+新时间跨度(1,0,0,0)-超过午夜
    差异=x>CurrentTimeSpan
    ?(x-CurrentTimeSpan).刻度
    :(x-CurrentTimeSpan+新TimeSpan(1,0,0,0))。刻度,
    时间=x})
    .OrderBy(x=>x.diff)
    
    .First()/@CodeNotFound:这应该是一个答案。你能发布一条吗?@mjwills如果当前时间是17.44,那么结果应该是17.45。如果时间是23.59,那么结果应该是06.00无论您选择什么解决方案,我建议您测试23:59场景。所有这些示例都选择下一个。你能确认一下你想要的是6:20,例如6:00返回吗?也许一个带有检查过的输入输出的小表格对你的问题有好处。@rAm根据DragandDrop的建议提供一个表格是至关重要的。效果很好。非常感谢。