如果您知道來自Excel的格式,則最好使用特定的IFormatterProvider將字符串解析爲C#中的DateTime。
這裏的問題是沒有關於來自Excel的字符串的文化信息,所以轉換爲DateTime只能考慮到數據庫的文化 - 在這種情況下是一種反轉月份和日期的格式。這將意味着超出範圍的日期(如您的情況)或模棱兩可的日期永遠不會正確解析。
在C#代碼中,您可以指定一種實現IFormatterProvider
的文化,en-GB具有您指定的Excel日期的日期格式。 MSDN documentation中的示例演示瞭如何執行此操作。我的例子介紹瞭如何將字符串轉換與EN-GB日期格式爲DateTime
是文化無關:
var culture = CultureInfo.CreateSpecificCulture("en-GB");
var date = DateTime.Parse("13/12/2011", culture);
SQL與文化同樣的問題。任何對文化敏感的數據的字符串表示總是會丟失當前的文化。轉換數據時,如果文件與服務器不同,則需要指定文化。
可以在SQL和硬編碼做到這一點,你正試圖轉換的字符串格式(103代表EN-GB日期格式DD/MM/YYYY):
declare @datestring varchar(10) = '13/12/2011' --13th December
-- 103 is the format code for UK dates with full yyyy century.
select convert(date, @datestring, 103) --gives 2011-12-13
declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date.
select convert(date, @datestring2, 103) --gives 2011-04-05
Convert/cast format codes.
同樣值得注意的是,這也將正確地轉換模糊的日期,例如2011年5月4日,如果文化未知,這將扭轉月/日。
例如,如果您試圖將英國2011年4月5日轉換爲美國日期,而不告訴解析器該格式是什麼,您將得到2011年5月4日的輸出 - 扭轉月份和日期。
用'DateTime'數據類型將是一件好事 – V4Vendetta