C#:謹慎 DateTime.Now 帶來的危險

iDotNetSpace發表於2010-10-25

這幾天在做考勤處理相關的專案,在介面上放了開始日期和結束日期兩個 DateTimePicker 控制元件,並都設定格式(Format)為 Short,再放置一個按鈕 Button1,這樣使用者點選這個按鈕時就對選擇的時間段進行資料分析處理。為了節省時間,我把開始日期和結束日期分別設定為 向前15天到當前日期:

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtdtpBeginTime.Value = DateTime.Now.AddDays(-15);
dtpEndTime.Value = DateTime.Now;// 因為 DateTimePicker控制元件預設為當前時間,因此我就沒有再設定,當然我設定後也測試過結果一樣

 

 

然後處理的時候我就這樣取天數了:

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtTimeSpan 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天!仔細想想,是不是預設日期出了問題了?

 

現在我把預設值改成(只取日期部分):

 

<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gtdtpBeginTime.Value = DateTime.Now.Date.AddDays(-15);
dtpEndTime.Value 
= DateTime.Now.Date;

 

 

豁然開朗!前途一片光明!這樣不管有沒有手工改動過,處理天數完全正確的。

 

回憶一下,原來 DateTime.Now 這裡包含時間,估計手工改開始日期的時候,微軟就把時間部分去掉了,直接改成 2010-10-6 0:0:0 這個時間了。這樣一處理,當然就有可能多出這麼變態的一天!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-676666/,如需轉載,請註明出處,否則將追究法律責任。

相關文章