關於DateTime在遠程服務器使用以及日期與時間格式的問題

昨天睡覺前鑫哥心情好開了半個小時的門放入了無數蒼蠅蚊子結果直接導致原本就輕微神經衰弱的我嚴重失眠...翻來覆去亂七八糟心事還多幹脆直接起牀把CRM Protype完成。於是,凌晨2點,新的一天開始了....

天有不測風雲,鬼知道(寢室的鬼說:我也不知道啊?....:)怎麼原先運行好好的程序在調整了下結構與加入幾條註釋後就出錯了....下面是整個問題的解決流程,絕對是血的教訓,在此備案將來引以爲鑑。

問題描述:
原先一直正常使用的ACT CRM Protype在今天優化了代碼之後突然不好用了,提示"The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value."但問題是代碼優化沒有修改業務邏輯與實現,只是針對結構的調整,本地調試沒有問題,但是上傳卻怎麼也調試不過,而之前一天在服務器還好好的運行。

解決過程:
out-of-range datetime 是超出時間範圍但明顯我輸入的時間沒有超出範圍....顯然是文本日期數據轉換爲SQL Server識別的日期進行插入這步出錯,開始懷疑是優化過程不小心修改了函數或者參數傳遞問題但本地爲什麼能通過呢?百思不得其解。

經過兩個多小時調試跟蹤了所有有關日期的變量,總算髮現將DATEMODIFY設置爲固定值01.01.1900是可以正確添加的,問題進一步縮小爲生成當前日期的值上,於是跟蹤之,突然發現用DateTime.Now.ToLocalTime().ToString()得到的服務器端運行時間是13.05.2007 22:46:00<==注意這裏的13
查看以前的記錄發現數據中有05.12.2007格式的2007年5月12日添加的數據,總算找到了問題所在:這裏的13是月而本地執行得到的格式是 05.13.2007 22:46:00,這是由於遠程服務器(在法國)時間環境不同造成的,因爲13大於12月所以提示out-of-range datetime。於是將DateTime.Now.ToLocalTime().ToString()換爲DateTime.Now.ToString("MM.dd.yyyy HH:mm:ss")來強制約束日期輸出格式,果然問題得到解決:)

這裏還有個值得警惕的地方是現在我添加的記錄在服務器中是我現在添加的數據日期在服務器端(法國)由GridView顯示的是13.05.2007 23:28:00而不是原本想象中的05.13.2007 23:28:00。

總結:現在本地服務器的默認輸出日期格式是MM.dd.yyyy,遠程服務器的默認輸出日期格式是dd.MM.yyyy,而SQL Server數據庫所默認需要的格式是MM.dd.yyyy,如果不強制約束格式爲MM.dd.yyyy的話本地沒有問題而在服務器上運行時每個月的前12天也沒有問題(其實是時間記錄有問題但我們發現不了)但13號就將是問題爆發日<====這纔是最可怕的

於是,凌晨5點40分,總算可以回籠了...Zzzzzz 這篇BLOG寫於剛剛睡醒不久....

發佈了46 篇原創文章 · 獲贊 5 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章