我有一个带有两个DateTime列的Datatable:date_from和date_to。
string dateFrom = row["date_from"].ToString();
string dateTo = row["date_to"].ToString();
当此代码在客户环境中运行时,它将按以下格式返回日期:
"2016-01-01 00.00.00"
"2016-02-01 00.00.00"
然后将此字符串插入SQL:
SELECT * FROM my_table
WHERE UPPER(status) = 'N'
AND trans_date >= {ts '1900-01-01 00.00.00' }
AND trans_date <= {ts '1900-01-01 00.00.00' }
执行此SQL时,它会返回错误&#34;从字符串转换日期和/或时间时转换失败。&#34;
因此,快速修复此问题是运行string.Replace(),其中我用冒号替换句点:
dateFrom = dateFrom.Replace(".", ":");
但是,我的问题是为什么返回日期作为时间戳分隔符而不是冒号?
我已在本地计算机上创建了此测试,但不幸的是,在这种情况下,它返回DateTime字符串的正确表示:
DataTable table = new DataTable();
table.Columns.Add("date", typeof(DateTime));
DataRow row = table.NewRow();
row["date"] = DateTime.Now;
table.Rows.Add(row);
DateTime date = DateTime.Parse(table.Rows[0]["date"].ToString());
我的猜测到目前为止它与客户文化有关,但我真的很感谢有经验的人提供的意见,所以我可以先向客户反馈为什么会发生这种情况。
这可能只是巧合,但值得一提的是,这只适用于使用Windows 10的用户。使用Windows 7的每个人都不会收到此错误。
答案 0 :(得分:2)
正如您所说,这是关于客户的文化。具体来说是CultureInfo.DateTimeFormat
。
此属性返回一个DateTimeFormatInfo
对象,该对象定义了显示日期和时间的文化上适当的格式。
此对象具有属性TimeSeparator
,用于获取或设置用于分隔时间组件的字符串,即小时,分钟和秒。
您可以设置此属性以指定:
之类的分隔符。
然而,更好的方法是将特定文化传递给ToString()
方法CultureInfo.InvariantCulture
(与文化无关):
string dateFrom = ((DateTime)row["date_from"]).ToString(CultureInfo.InvariantCulture);
string dateTo = ((DateTime)row["date_to"]).ToString(CultureInfo.InvariantCulture);
或使用您自己的格式:
string dateFrom = ((DateTime)row["date_from"]).ToString("yyyy-MM-dd HH:mm:ss");
string dateTo = ((DateTime)row["date_to"]).ToString("yyyy-MM-dd HH:mm:ss");