C#:谨慎 DateTime.Now 带来的危险
这几天在做考勤处理相关的项目,在界面上放了开始日期和结束日期两个 DateTimePicker 控件,并都设置格式(Format)为 Short,再放置一个按钮 Button1,这样用户点击这个按钮时就对选择的时间段进行数据分析处理。为了节省时间,我把开始日期和结束日期分别设置为 向前15天到当前日期:
dtpBeginTime.Value = DateTime.Now.AddDays(-15);
dtpEndTime.Value = DateTime.Now;// 因为 DateTimePicker控件默认为当前时间,因此我就没有再设置,当然我设置后也测试过结果一样
dtpEndTime.Value = DateTime.Now;// 因为 DateTimePicker控件默认为当前时间,因此我就没有再设置,当然我设置后也测试过结果一样
然后处理的时候我就这样取天数了:
TimeSpan ts = EndTime.Value-BeginTime.Value;
int dayCount = (int)Math.Ceiling(ts.TotalDays) + 1;// 加1是因为开始日期那天也是要处理的。
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;
dtpEndTime.Value = DateTime.Now.Date;
豁然开朗!前途一片光明!这样不管有没有手工改动过,处理天数完全正确的。
回忆一下,原来 DateTime.Now 这里包含时间,估计手工改开始日期的时候,微软就把时间部分去掉了,直接改成 2010-10-6 0:0:0 这个时间了。这样一处理,当然就有可能多出这么变态的一天!