如何将DateTime舍入23次?


for (int i = 0; i < 23; i++)
{
var dt = RoundDown(DateTime.Now, TimeSpan.FromMinutes(5));
datestimes.Add(dt);
}

DateTime RoundDown(DateTime date, TimeSpan interval)
{
return new DateTime(
(long)Math.Floor(date.Ticks / (double)interval.Ticks) * interval.Ticks
);
}

datestimes isList<DateTime>

我需要使第一次四舍五入将是当前的DateTime。现在,例如,如果它是23:44,那么四舍五入到23:40,这就是现在的情况。

但是从这里开始,我想再四舍五入22次例如23:40 23:35 23:30 23:25这样再四舍五入22次并将每次四舍五入的日期时间添加到List

只向下舍入一次。然后,减去间隔,而不是舍入。

DateTime dt = RoundDown(DateTime.Now, TimeSpan.FromMinutes(5));
while ( dt.Minutes != 0 )
{
// your code
dt = dt.AddMinutes(-5);
}

在循环前声明DateTime.Now变量。得到分钟数,得到四舍五入的值。然后运行一个for循环,持续减少5分钟,并添加到您的列表中。

要得到小于或等于N并除以K的最大的数,你可以写这个简单的方法。

int findNum(int N, int K)
{
    int rem = N % K;
 
    if (rem == 0)
        return N;
    else
        return N - rem;
}

在你的例子中,K是5。

您实际上忘记了减少向下舍入的日期值,这可以在.AddMinutes(-5 * i)中完成。

除此之外,只计算一次日期也更有效。这样做还可以防止在时钟在后台更改为下一个5分钟间隔的情况下代码运行时出现竞争条件。

改进代码:

var startDate = DateTime.Now;
for (int i = 0; i < 23; i++)
{
var dt = RoundDown(startDate.AddMinutes(-5 * i), TimeSpan.FromMinutes(5));
Console.WriteLine(dt);
}

工作演示:https://dotnetfiddle.net/6o5HyW