在 dataTable 行中将特定字符串转换为 DateTime

4
我正在尝试将一个特定的字符串转换为DataTable中包含的DateTime,但是不知道为什么没有起作用。我已经尝试了几种组合。问题在于,该字符串实际上包含日期周围的引号。

因此,包含值(包括双引号)的DataTable单元格如下:

"2014-08-08 08:00:00"

我的代码遍历所有内容,并尝试将其转换为DateTime(需要将其做为bulkCopy.WriteToServer数据写入SQL Server)。

  //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呢? - Joonas Koski
3个回答

1

你应该使用

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

不行。首先,应该是dt.Rows[i]["invoiceid"]而不是dtRows[i]。第二,由于字符串用双引号括起来,所以您需要更改您的格式。第三,没有DD作为格式。第四,在他的示例中日期分隔符为-而不是/ - Soner Gönül

1
你混淆了单引号(')和双引号(")。
因此,当你编写Replace("'", "")部分时,它不会替换任何内容,因为你的字符串中没有任何单引号。这就是为什么一个解决方案可能是在你的代码中从Replace("'", "")更改为Replace("\"", "")
但是这里还有另一种方法。

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

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

0
刚刚意识到我执行了 Ctrl + Z,但仍未覆盖双引号,只有单引号。已替换为


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

现在一切都正常工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接