• 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 这个时间了。这样一处理,当然就有可能多出这么变态的一天!

    版权声明 作者:夏荣全
    网站:http://www.lyout.com 邮箱:lyout(at)163.com
    扣扣:249775085
    本文版权归作者所有,转载请注明出处:http://www.cnblogs.com/lyout/
  • 相关阅读:
    【数据库领域】mysql中in与or对比
    数据库优化
    数据库-索引
    数据库-事务
    数据库-视图
    数据库设计
    数据库编程提高
    数据库高级操作
    数据库基本操作
    with-上下文管理器
  • 原文地址:https://www.cnblogs.com/lyout/p/1857500.html
Copyright © 2020-2023  润新知