在 C# 中舍入日期时间 - 为什么此解决方案有效?

Rounding datetime in c# - why does this solution work?

我想将 C# 中的日期时间对象四舍五入到最接近的分钟。因此,如果 datetime 对象有 1 分 29 秒 999 毫秒,则应四舍五入为 1 分钟。如果有1分30秒0毫秒,则四舍五入为2分钟。

我实现了从互联网上找到的这个解决方案:

var timespan = new TimeSpan(0, 0, 1, 0);
//timespan has a value of 1 minute because I want to round to the nearest minute
return new DateTime(((dateTime.Ticks + timespan.Ticks/2)/ timespan.Ticks)* timespan.Ticks);

我不确定最后一行。为什么要除以 2?为什么要先除以timespan.Ticks再乘?

很多人使用四舍五入的方法来增加所需精度的一半,然后去掉小数点。示例:

  • 所需精度:0.1 ( / 2 -> 加 0.05 )

    1.44 + 0.05 = 1.49 -> cut last -> 1.4
    1.46 + 0.05 = 1.51 -> cut last -> 1.5
    
  • 所需精度:0.01 ( / 2 -> 加 0.005 )

    1.443 + 0.005 = 1.448 -> cut last -> 1.44
    1.465 + 0.005 = 1.470 -> cut last -> 1.47
    
  • 所需精度:1 分钟 -> 添加 0.5 分钟或 30 秒或 30000 个刻度*(假设 1 秒 = 1000 个刻度)。只要您在所有计算中保持单位相同,单位并不重要。

    1min 25s + 30s = 1min 55s -> cut -> 1min
    1min 35s + 30s = 2min 05s -> cut -> 2min
    

所以日期时间也是一样的。为了按分钟取整,你可以加半分钟,然后把剩下的减掉。

刻度 是表示时间的一种方式。因此,只需计算一分钟的滴答计数 (new TimeSpan(0, 0, 1, 0)),将其除以二得到一半,然后将其添加到您的时间中。

现在您需要做的就是削减其余部分,您可以通过以 精度(滴答计数 1 分钟)投入时间来完成。当您除以 1 分钟时,小于一分钟的所有内容都将保留为小数。 Tick 是一个整数,所以它 "forgets" 所有小数,从而将它们去掉。现在您需要做的就是通过将它与您除以的相同值相乘来使该值再次有效。此时小数点已经丢失,所以... TADAA:按分钟四舍五入。