我正在尝试将特定的String转换为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。
任何想法如何使演员工作正常?
答案 0 :(得分:1)
您应该使用
DateTime.ParseExact(dtRows[i], "yyyy/MM/DD HH:mm:ss", CultureInfo.InvariantCulture);
答案 1 :(得分:1)
您正在将单引号('
)与双引号("
)混合使用。
这就是为什么当您编写Replace("'", "")
部分时,它不会替换任何内容,因为您的字符串没有任何单引号。这就是您的代码中某个解决方案可能会从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 :(得分:0)
刚刚意识到我做了 Ctrl + Z 并且仍未覆盖双引号,只是单引号。替换为
dt.Rows[i]["usagestartdate"] = dt.Rows[i]["usagestartdate"].ToString() == "" ?
DateTime.Now.AddYears(-2014) :
Convert.ToDateTime((dt.Rows[i]["usagestartdate"].ToString().Replace("\"", "")));
现在一切正常!