我有一个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方法来确定这个?如果没有,那么确定这个的好方法。
答案 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)));