从 excel 读取日期 > 12 的日期时,日期时间转换不起作用

DateTime conversion is not working while reading dates from excel where Day > 12

这是我的 XLSX 文件中的前 5 行:

请注意,ResLastCallDate 列的格式为 CustomFormat->dd/mm/yyyy hh:mm:ss。然而,出于某种原因,第 4 行看起来与其他行不同。这并不重要,重要的是 XLSX 文件正在上传到我的 asp.net 4.5 网页,我通过 EPPlus 读取数据。但是,当我阅读 ResLastCallDate 列时,我收到一条错误消息。请看下面的代码:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;
if (!DateTime.TryParse(dr["ResLastCallDate"].ToString(),provider, System.Globalization.DateTimeStyles.AssumeLocal, out resLastCallDate))
{
     Msg = Msg + string.Format("Row {0}: ResLastCallDate is not date ({1}).\n", r, dr["ResLastCallDate"].ToString());
}
...
txtDebug.Text = Msg;

我尝试不使用提供程序,其他 DateTimeStyles,其中 none 有效,除了 excel 中的第 4 行始终被正确读取。查看输出:

Row 0: ResLastCallDate is not date (20/03/2018 13:58)
Row 1: ResLastCallDate is not date (20/03/2018 13:58)
Row 3: ResLastCallDate is not date (15/03/2018 20:25)

所以第 2 行(等于 ClientID=3621)有效,但其他行则没有原因。我已经为这些单元格在 excel 中尝试了常规格式和日期格式,但仍然无法正常工作。我还能做些什么来处理这个问题?任何帮助将不胜感激。

编辑:当我将它转换为 dr["ResLastCallDate"].ToString() 时(我没有使用提供者),它在我的本地机器上工作,但是当我发布到服务器时它不工作(收到相同的错误消息)

请使用适当的文化。

var originalDate = "6/4/18 6:07 PM";
DateTime parsedDate;

var culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-AU");
var styles = System.Globalization.DateTimeStyles.None;
if (!DateTime.TryParse(originalDate, culture, styles, out parsedDate))
{
       Console.WriteLine(parsedDate);
}

        Console.WriteLine($"Parse successfull: {parsedDate}");

CultureInfo.InvariantCulture 似乎不喜欢接收特定格式的字符串。我认为这与以下事实有关:在美国,日期是按 MM/dd/yyyy 顺序编写的,而在欧洲,日期是按 dd/MM/yyyy(包括英国和澳大利亚)编写的。

如果是这样,20/03/2010 13:58 将被解析为 2010 年第 20 个月的第 3 天,这没有任何意义。

我认为在这里使用 `new CultureInfo("en-gb") 而不是 CultureInfo.InvariantCulture 会是更好的选择。