C#:谨慎 DateTime.Now 带来的危险

这几天在做考勤处理相关的项目,在界面上放了开始日期和结束日期两个 DateTimePicker 控件,并都设置格式(Format)为 Short,再放置一个按钮 Button1,这样用户点击这个按钮时就对选择的时间段进行数据分析处理。为了节省时间,我把开始日期和结束日期分别设置为 向前15天到当前日期:

 

dtpBeginTime.Value = DateTime.Now.AddDays(-15);
dtpEndTime.Value = DateTime.Now;// 因为 DateTimePicker控件默认为当前时间,因此我就没有再设置,当然我设置后也测试过结果一样

 

 

然后处理的时候我就这样取天数了:

 

TimeSpan ts = EndTime.Value-BeginTime.Value;
int dayCount = (int)Math.Ceiling(ts.TotalDays) + 1;// 加1是因为开始日期那天也是要处理的。

 

然后我随便测试了几次就交给技术支持去测试了。过不久反馈来了:

处理的时候老是多了一天。

 

比如 今天是 21 号,那么默认 begintime 就是 21-15=6 号,总天数是 15+1=16 天,按他的意思应该变成了 17 天,但是事实上并不如此,我处理的时候也是 16天呀,那是哪里出了问题了呢?正在我百思不得其解的时候,我在处理界面上手工把开始日期改到 7号,按推算  21-7=14,再加1应该是15天,而处理过程中却是16天!那这多出的一天是怎么来的了?

我再次打开窗口,不做任何改动运行处理,结果还是 16天!仔细想想,是不是默认日期出了问题了?

 

现在我把默认值改成(只取日期部分):

 

dtpBeginTime.Value = DateTime.Now.Date.AddDays(-15);
dtpEndTime.Value 
= DateTime.Now.Date;

 

 

豁然开朗!前途一片光明!这样不管有没有手工改动过,处理天数完全正确的。

 

回忆一下,原来 DateTime.Now 这里包含时间,估计手工改开始日期的时候,微软就把时间部分去掉了,直接改成 2010-10-6 0:0:0 这个时间了。这样一处理,当然就有可能多出这么变态的一天!

posted @   里沃特  阅读(4215)  评论(12编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示