四舍五入日期时间为什么这个解决方案工作

本文关键字:解决方案 工作 为什么 日期 时间 四舍五入 | 更新日期: 2023-09-27 18:12:55

我想将c#中的datetime对象四舍五入到最接近的分钟。因此,如果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?为什么我们要用时间来划分。滴答,然后相乘?

四舍五入日期时间为什么这个解决方案工作

这是一种常用的四舍五入方法,添加所需精度的一半,然后去掉小数。例子:

  • 期望精度:0.1 (/2 -> add 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 -> add 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分钟或30s或30000滴答*(假设1s = 1000滴答)。单位不重要,只要你在所有的计算中保持单位相同。

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

datetime也是一样的。为了按分钟计算,你可以加半分钟,然后把剩下的剪掉。

刻度是表示时间的一种方式。所以只要把一分钟的滴答计数(new TimeSpan(0, 0, 1, 0)),除以2得到一半,然后把它加到你的时间里。

现在所有你需要做的是削减其余的,你可以做到这一点,通过潜水你的时间与精度(滴答计数1分钟)。当你除以1分钟,所有小于1分钟的都是小数。Tick是一个整数,所以它会"忘记"所有的小数,从而把它们切掉。现在你所需要做的就是让这个值再次有效通过将它乘以你所除以的那个值。现在已经没有小数了,所以…