C# 如何计算一个时间跨度范围是否介于哪个时间跨度范围之间

C# 如何计算一个时间跨度范围是否介于哪个时间跨度范围之间,c#,linq,timespan,C#,Linq,Timespan,假设我有两个时间跨度范围 07.00.00 - 18.59.59 19.00.00 - 06.59.59 现在我有一个时间跨度范围,我们称之为持续时间 public class Duration { public TimeSpan StartingTime{get; set;} public TimeSpan EndingTime{get; set;} } 初始化为 StartingTime 05.00.00 EndingTime 06.00.00 我想生成一个方法,在其中传入ti

假设我有两个时间跨度范围

07.00.00 - 18.59.59
19.00.00 - 06.59.59
现在我有一个时间跨度范围,我们称之为持续时间

public class Duration {
  public TimeSpan StartingTime{get; set;}
  public TimeSpan EndingTime{get; set;}
}
初始化为

StartingTime 05.00.00
EndingTime 06.00.00
我想生成一个方法,在其中传入timespan范围列表,并生成一个新的timespan,它将返回正确的timespan范围

我尝试过修改TimeSpan,也尝试过将TimeSpan范围转换为datetime,但结果失败(不返回任何内容)

我也试着和你一起去

var fee = fees.Where(a=> parking.StartTime <= a.EndingTime && parking.EndTime >= a.StartingTime).First();
var-fee=fees.Where(a=>parking.StartTime=a.StartingTime.First();
其中停车将是持续时间类,费用将是时间跨度范围的列表

我也看过了,但这也没有得到有效的解决方案

我已经很沮丧了,想不出解决办法

编辑:以@NetMage为例,有一个19.40-20.35会导致失败的例子,我修正了添加另一个条件

var fee = fees
                .First(r => (r.StartingTime <= r.EndingTime) ?
                        (r.StartingTime <= parking.StartTime && parking.StartTime <= r.EndingTime) :
                        (parking.StartTime <= r.EndingTime) ?
                        (r.StartingTime <= parking.StartTime + oneDay && parking.StartTime <= r.EndingTime)
                        : (r.StartingTime <= parking.StartTime + oneDay && parking.StartTime <= r.EndingTime + oneDay)
                        );
var费用=费用
.First(r=>(r.StartingTime r.StartingTime>=开始和结束时间已更新,以解决将期间滚动到第二天的问题

为此,使用
TimeSpan
非常方便,但如果某个时段滚动到第二天,这将使查询变得非常复杂和笨拙

通过将涵盖两天的期间分为以下两个期间,可以轻松解决此问题:

00.00.00 - 06.59.59 //off peak 1
07.00.00 - 18.59.59 //peak
19.00.00 - 23.59.59 //off peak 2
在您的示例中,您需要处理两种可能的情况:

  • 停车时间完全在一个收费期内,由您的查询处理
  • 停车持续时间重叠两个(或多个)时间段-您的查询将与此时间段的任何结果都不匹配,并且将崩溃,因为您使用的是
    .First()
  • 要获得更准确的答案,您需要指定您所需的行为。如果这些行为可能适用,这里有两种可能性:

    此查询将返回停车开始的收费期

    var费用=费用。其中(期间=>
    parking.StartTime>=period.StartTime&&parking.StartTime
    
    parking.EndTime>=period.StartingTime&&parking.EndTime假设您的时间范围列表是一个
    列表
    ,您可以这样查询:

    var OneDay = new TimeSpan(24,0,0);
    
    var startAns = ranges.First(r => {
        var rEndingTime = (r.StartingTime > r.EndingTime) ? r.EndingTime + OneDay : r.EndingTime;
        return (r.StartingTime <= parking.StartingTime && parking.StartingTime <= rEndingTime) ||
               (r.StartingTime <= parking.StartingTime + OneDay && parking.StartingTime + OneDay <= rEndingTime);
    });
    
    var endAns = ranges.First(r => {
        var rEndingTime = (r.StartingTime > r.EndingTime) ? r.EndingTime + OneDay : r.EndingTime;
        return (r.StartingTime <= parking.EndingTime && parking.EndingTime <= rEndingTime) ||
               (r.StartingTime <= parking.EndingTime + OneDay && parking.EndingTime + OneDay <= rEndingTime);
    });
    

    你可以发布你的费用模型吗?你的停车变量是否实现了持续时间模型?你还不清楚你想要的是哪种类型的输出。是不是有任何费用超出了或指定的范围,还是在指定的范围内?嗯,你为什么在时间跨度而不是日期时间内实现持续时间?更好然而,为什么要有一个持续时间类,而不仅仅是使用一个时间跨度?你能给出一个输入和预期输出的例子吗?开始部分正是我想要的。干杯。编辑//在第二次查看时。它仍然失败,因为在这种情况下,它应该属于19.00.00-06.59.59的范围。但作为开始时间,例如05.00.00不大于时段开始时间(19.00.00)这仍然返回一个错误。@EgertAia您的范围让我感到困惑。您的范围从19开始到7结束。您的开始时间怎么可能大于结束时间?这是因为它会持续到第二天吗?@EgertAia我看到了-答案更新了我的建议以解决此问题。可以通过查询完成,但我认为这是一个更好的解决方案注意:Hello@NetMage这是一个很好的解决方案,但在时间为19:40–20:35的情况下会失败。这是因为条件parking.StartTime如果可能的话,你能帮我考虑一下结束时间重叠的类似情况吗?你是对的,优化版本并不是在所有情况下都有效。我添加了驻车。结束时间
    00.00.00 - 06.59.59 //off peak 1
    07.00.00 - 18.59.59 //peak
    19.00.00 - 23.59.59 //off peak 2
    
    var OneDay = new TimeSpan(24,0,0);
    
    var startAns = ranges.First(r => {
        var rEndingTime = (r.StartingTime > r.EndingTime) ? r.EndingTime + OneDay : r.EndingTime;
        return (r.StartingTime <= parking.StartingTime && parking.StartingTime <= rEndingTime) ||
               (r.StartingTime <= parking.StartingTime + OneDay && parking.StartingTime + OneDay <= rEndingTime);
    });
    
    var endAns = ranges.First(r => {
        var rEndingTime = (r.StartingTime > r.EndingTime) ? r.EndingTime + OneDay : r.EndingTime;
        return (r.StartingTime <= parking.EndingTime && parking.EndingTime <= rEndingTime) ||
               (r.StartingTime <= parking.EndingTime + OneDay && parking.EndingTime + OneDay <= rEndingTime);
    });
    
    var ans = ranges.Select(r => new { r, r.StartingTime, EndingTime = (r.StartingTime > r.EndingTime ? r.EndingTime + OneDay : r.EndingTime)})
                    .Where(r => (r.StartingTime <= parking.StartingTime && parking.StartingTime <= r.EndingTime) ||
                                (r.StartingTime <= parking.StartingTime+OneDay && parking.StartingTime+OneDay <= r.EndingTime))
                    .Select(r => r.r).First();