DateTime时间戳具有句点而不是冒号

时间:2016-02-29 17:30:16

标签: c# sql sql-server datetime datatable

我有一个带有两个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的每个人都不会收到此错误。

1 个答案:

答案 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");