DateTime向上取整至最近小时的两种实现性能基准测试疑问
DateTime 向上取整至最近小时的实现对比与基准测试
最近我对如何把DateTime的分钟/秒向上取整到最近小时(直接忽略当前分秒,跳到下一小时)的实现行为有点疑问,所以特意写了两种不同的实现方式,并用BenchMarkDotNet做了基准测试来对比。
测试代码
private DateTime testData = DateTime.Now; [Benchmark] public DateTime CeilingUsingNewOperator() => new DateTime(testData.Year, testData.Month, testData.Day, testData.Hour + 1, 0, 0); [Benchmark] public DateTime CeilingUsingAddOperator() => testData.AddHours(1).AddMinutes(-testData.Minute).AddSeconds(-testData.Second);
实现逻辑与注意点
CeilingUsingNewOperator方法:直接通过DateTime构造函数创建新实例,把当前小时加1,分钟和秒设为0。这种方式看起来简洁直接,但有个隐藏的边界问题:如果当前时间是当天的23点(比如23:45:30),testData.Hour + 1会得到24,而DateTime构造函数不允许小时值超过23,这时候会抛出ArgumentException,导致代码崩溃。CeilingUsingAddOperator方法:先通过AddHours(1)把时间加1小时,再分别减去当前的分钟和秒数。这种方法能自动处理跨天的情况(比如23点加1小时会自动变成次日0点),不会出现参数非法的问题,逻辑更健壮。
基准测试预期
从性能角度看,直接构造DateTime实例的方法理论上会比多次调用Add方法更快,但前者的边界问题是必须要注意的——如果你的业务场景中存在当天23点的时间,一定要避免使用第一种实现,否则会引发异常。
内容的提问来源于stack exchange,提问作者Anu Viswan
相关产品推荐
相关产品推荐

