【问题标题】:DateTime timestamp has period instead of colonDateTime 时间戳有句点而不是冒号
【发布时间】:2016-06-12 20:32:45
【问题描述】:

我有一个包含两个 DateTime 列的数据表: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 时,它返回错误“从字符串转换日期和/或时间时转换失败。”

因此,快速解决此问题的方法是运行 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 的每个人都不会收到此错误。

【问题讨论】:

  • 你为什么在SQL中使用字符串连接,为什么不使用参数?如果你这样做,那么文化设置为什么都没有关系。
  • 您可以使用自定义日期字符串来避免本地文化问题:msdn.microsoft.com/en-us/library/… 例如 date.ToString("yyyy-MM-dd H:mm:ss")
  • 感谢您提供有关参数化和使用自定义 ToString() 的意见。我会执行的。

标签: c# sql sql-server datetime datatable


【解决方案1】:

正如您所说,这是关于客户的文化。特别是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");

【讨论】:

  • HH 而不是 hh,可能会更好 - 后者是 12 小时制
  • 感谢您详细的回答阿图罗,它澄清了我的问题!
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多