如果您知道来自 Excel 的格式,最好使用特定的 IFormatterProvider 将字符串解析为 C# 中的 DateTime。
这里的问题是来自 Excel 的字符串没有文化信息,因此转换为 DateTime 只能考虑数据库的文化 - 在这种情况下是一种反转月份和日期的格式。这将意味着超出范围的日期(如您的情况)或不明确的日期将永远无法正确解析。
在 C# 代码中,您可以指定实现的文化IFormatterProvider
,en-GB 具有您指定的 Excel 日期的日期格式。MSDN 文档中的示例显示了如何执行此操作。我的示例简报展示了如何将具有 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
转换/转换格式代码。
还值得注意的是,这也将正确转换模棱两可的日期,例如 05/04/2011,如果文化未知,这将反转月/日。
例如,如果您尝试将 2011 年 4 月 5 日的英国日期转换为美国日期而不告诉解析器格式是什么,您将得到 2011 年 5 月 4 日作为输出 - 反转月份和日期。