更高效推进DateTime至当前时间之后且保留原小时的方法探究
更高效的日期推进方法
当然有更高效的实现方式!你当前的逐天循环方法,当两个日期跨度很大时(比如从2000年到2024年),会执行数千次循环,完全没必要。我们可以通过直接计算目标日期,一步到位完成需求,时间复杂度是O(1),比循环高效得多。
核心思路
我们需要找到第一个晚于now、且时间部分与startDate完全一致的日期:
- 先基于
now的日期,替换成startDate的时间,得到一个候选日期 - 如果这个候选日期已经晚于
now,它就是我们要的结果 - 如果候选日期不晚于
now,只需要给它加一天即可
实现代码
var now = DateTime.Parse("27/03/2018 02:35"); var startDate = DateTime.Parse("01/03/2000 16:00"); // 创建候选日期:使用now的年月日,加上startDate的时分秒 var candidate = new DateTime(now.Year, now.Month, now.Day, startDate.Hour, startDate.Minute, startDate.Second); // 如果候选日期不晚于now,就加一天 if (candidate <= now) { candidate = candidate.AddDays(1); } Console.WriteLine(candidate); // 输出:27/03/2018 16:00:00
边界情况说明
- 如果
now的时间恰好等于startDate的时间(比如now是27/03/2018 16:00),候选日期会等于now,这时候我们需要加一天,得到28/03/2018 16:00,确保结果严格晚于当前时间 - 不管
startDate和now相差多少年,这个方法都只需要一次计算,不会有循环的性能损耗
内容的提问来源于stack exchange,提问作者Andrew Jocelyn
相关产品推荐
相关产品推荐

