【问题标题】:Convert specific string to dateTime in dataTable Row将特定字符串转换为 dataTable Row 中的 dateTime
【发布时间】:2025-12-02 09:25:01
【问题描述】:

我正在尝试将特定字符串转换为包含在 DataTable 中的 DateTime。但由于某种原因不太有效。我尝试了几种组合。问题是字符串实际上包含日期周围的“”。

所以 DataTable 中的单元格包含值(包括双引号) “2014-08-08 08:00:00”

我的代码遍历所有内容并尝试将其转换为 DateTime(需要它作为对 SQL Server 执行 bulkCopy.WriteToServer(datatable) 的操作。

  //Fix up default values and remove double quotes from field in order to convert to date
  if(dt.Rows.Count > 0)
  {
      for (int i = 0; i < dt.Rows.Count; i++)
      {
          dt.Rows[i]["usagestartdate"] = 
              dt.Rows[i]["usagestartdate"].ToString() == "" ?
              DateTime.Now.AddYears(-2014) : 
              Convert.ToDateTime((dt.Rows[i]["invoiceid"].ToString().Replace("'", "")));
          dt.Rows[i]["usagestartdate"] = 
              dt.Rows[i]["usageend"].ToString() == "" ? 
              DateTime.Now.AddYears(-2014) : 
              Convert.ToDateTime(dt.Rows[i]["usageend"].ToString());
      }
  }

我在循环内的第一行得到错误。

字符串未被识别为有效的日期时间。

任何想法如何使演员正常工作?

【问题讨论】:

  • 只是一个旁注:DateTime.Now.AddYears(-2014) 看起来......很有趣。为什么不直接使用 DateTime.MinValue?

标签: c# string datetime datetime-parsing


【解决方案1】:

您将单引号 (') 与双引号 (") 混合在一起。

这就是为什么当您编写 Replace("'", "") 部分时,它不会替换为任何内容,因为您的字符串没有 any 单引号。这就是为什么一种解决方案可能会在您的代码中从 Replace("'", "") 更改为 Replace("\"", "")

但这里有另一种方式

由于您使用的是Convert.ToDateTime(string) overload,因此此方法默认使用您的CurrentCulture 设置。并且没有一种文化具有标准的日期和时间格式,双引号字符串为"yyyy-MM-dd HH:mm:ss"。这就是为什么,您需要使用 DateTime.TryParseExact method 的自定义日期和时间解析,例如;

string s = "\"2014-08-08 08:00:00\"";
string format = "\\\"yyyy-MM-dd HH:mm:ss\\\"";
DateTime date;
if(DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out date))
{
    Console.WriteLine (date);
}

这里是 demonstration

【讨论】:

    【解决方案2】:

    你应该使用

    DateTime.ParseExact(dtRows[i], "yyyy/MM/DD HH:mm:ss", CultureInfo.InvariantCulture);
    

    【讨论】:

    • 那不行。首先,它是dt.Rows[i]["invoiceid"],而不是dtRows[i]。其次,用双引号括起来的字符串,这就是为什么你需要改变你的格式。第三,没有DD 作为格式。第四,在他的例子中,日期分隔符是- 而不是/
    【解决方案3】:

    刚刚意识到我做了一个 Ctrl + Z 并且仍然没有覆盖双引号,只是单引号。替换为

    dt.Rows[i]["usagestartdate"] = dt.Rows[i]["usagestartdate"].ToString() == "" ? 
                                   DateTime.Now.AddYears(-2014) : 
                                   Convert.ToDateTime((dt.Rows[i]["usagestartdate"].ToString().Replace("\"", "")));
    

    现在一切正常!

    【讨论】: