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

时间:2014-03-31 19:57:46

标签: c# datetime datetimepicker

我有一个TimeSpan变量可能有时间像10:00:00或某个时间像10:23:00 此外,我还有另一个用于设置时间间隔的TimeSpan变量,目前默认为一小时间隔设置1:00:00

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

有没有内置的.NET方法来确定这个?如果没有,那么确定这个的好方法。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我想这符合您的需求。请记住,它会检查确切的刻度(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)));

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

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)));

通过:Rounding DateTime objects