System.FormatException:'String '“2022-04-14 13:03:12”'未被识别为有效的日期时间。'

System.FormatException: 'String '"2022-04-14 13:03:12"' was not recognized as a valid DateTime.'

cnn.Open();
using (StreamReader reader = new StreamReader(@"C:/Users/jhogan/Documents/Test Folder/test_import.csv"))
                {
                  while (!reader.EndOfStream)
                  {
                      var line = reader.ReadLine();
                      if (lineNumber != 0)
                      {
                         var values = line.Split(',');
                         var date = values[0];
                         var sentDate = DateTime.ParseExact(date, "yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture);
                    
                         await cnn.ExecuteAsync(insertFeedback, new { 
       @SentDate = sentDate, @RatedDate = values[1], @Rating = values[2], @Location = values[3], @Notes = values[4], @Email = values[5], @Feedback = values[6] },commandTimeout: 120,commandType: CommandType.StoredProcedure);}

我正在尝试将此数据从 csv 文件加载到我的数据库中,但是 运行 出现了标题中的以下错误。我的 csv 中日期的原始格式是 HH:MM:SS PM/AM,我在数据库中的列类型是 datetime。在我的数据库中,日期时间格式为 YYYY-MM-DD HH:MM:SS:MMM。我认为这是因为数据库的格式问题,但我真的不确定。

my column type in the database is datetime. In my database, the datetime formatting is YYYY-MM-DD HH:MM:SS:MMM.

您误解了数据库和 .Net DateTime 值的工作方式。如果列类型或数据类型是DateTime,那么在数据库或内存中的格式是binary,当你看到YYYY-MM-DD HH:MM:SS:MMM时,它只是一个[=43] =]您的工具为您提供的便利。无需尝试将您的字符串与该内部二进制格式匹配。

但是对于代码,问题是格式字符串中的lower-case hh。我们可以在 the documentation 中看到 lower-case h 是 12 小时的时间,而 upper-case H 是 24 小时的时间。从问题标题中的错误来看输入字符串2022-04-14 13:03:12,我们在这个位置有一个13,这肯定会让你在upper-case H territory:

var sentDate = DateTime.ParseExact(date, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

但比这更糟。我也在评论中看到了这个:

the first row is 4/14/2022 1:03:12 PM

所以首先,DateTime.ParseExact() 的格式字符串告诉原始输入源字符串的格式,不是解析值的目标格式,它是,毕竟是二进制,反正不是人类可读的。

解析该值的格式字符串如下所示:M/dd/yyyy h:mm:ss tt。还要注意在某些位置使用成对字符和单个字符。

var sentDate = DateTime.ParseExact(date, "M/dd/yyyy h:mm:ss tt", CultureInfo.InvariantCulture);

但这里真正重要的是问题标题中的错误和评论之间的差异意味着您可能有格式的混合。这很可怕。 DateTime.ParseExact() 使用 strict 解析。如果输入 EXACTLY 与预期格式不匹配,您 WILL 会得到一个异常。

幸运的是,还有一个overload for the method that accepts multiple format strings。不过,即使有这种超载,您可能也需要花时间检查 csv 数据并确保数据中的每一种可能格式都被考虑在内。

如果这个字段的数据可以由随机的人输入,愿上帝怜悯你的灵魂。