确定一个时间跨度是否落入另一个时间跨度间隔

本文关键字:时间跨度 是否 另一个 一个 | 更新日期: 2023-09-27 17:55:23

我有一个TimeSpan变量,它可以是像10:00:00这样的时间,也可以是像10:23:00这样的时间而且我还有另一个用于设置时间间隔的TimeSpan变量,目前默认情况下它以一小时间隔设置,因此1:00:00

正在寻找一种好方法来确定我的时间跨度变量是否属于我的间隔?例如,如果间隔是每一小时一次,那么10:00:00就可以了,因为我们有小时或 1,2,3,4,5,等等。但是10:23:00是不行的,因为我们有1011,但没有10:23

是否有任何内置的.NET方法来确定这一点? 如果没有,那么确定这一点的好方法是什么。

确定一个时间跨度是否落入另一个时间跨度间隔

您的函数需要一个开始时间,作为日期时间、间隔,然后是要测试的日期时间。 要查看测试值相对于给定开始时间是否是给定间隔的倍数,您可以简单地计算当前时间和开始时间之间的时间跨度,并查看这些时钟周期的剩余部分除以间隔时是否为零。

public static bool IsOnTick(DateTime start, TimeSpan interval, 
    DateTime dateToTest)
{
    return (dateToTest - start).Ticks % interval.Ticks == 0;
}
我想

这将满足您的需求。请记住,它会检查到确切的刻度(1/10000 秒)。

static bool IsAtExactInterval(TimeSpan value, TimeSpan interval)
{
    long remainder = value.Ticks % interval.Ticks;
    return remainder == 0;        
}
Assert.IsTrue(IsAtExactInterval(new TimeSpan(10, 0, 0), new TimeSpan(1, 0, 0)));
Assert.IsFalse(IsAtExactInterval(new TimeSpan(10, 23, 0), new TimeSpan(1, 0, 0)));

处理使用当前日期和时间(如 DateTime.Now.TimeOfDay)生成的TimeSpan时,您可能希望先对值进行舍入:

static TimeSpan Round(TimeSpan value, TimeSpan valueToRoundTo)
{
    long factor = (value.Ticks + (valueToRoundTo.Ticks / 2) + 1) / valueToRoundTo.Ticks;
    return new TimeSpan(factor * valueToRoundTo.Ticks);
}
TimeSpan value = new TimeSpan(10, 0, 25);
TimeSpan oneMinute = new TimeSpan(0, 1, 0);
TimeSpan roundedValue = Round(value, oneMinute);
Assert.IsTrue(new TimeSpan(10, 0, 0), roundedValue);
Assert.IsTrue(IsAtExactInterval(roundedValue, new TimeSpan(1, 0, 0)));

通过:舍入日期时间对象