C#日期格式与Windows日期格式

问题描述

获得一个sql Server数据库,该数据库具有一个表,该表的列类型为“日期”。

通过Visual Studio中的sql Server Object Explorer在表上进行选择时,该字段的值返回为'2016-01-17',这是正确的。

但是从C#进行操作

cmd = new System.Data.sqlClient.sqlCommand("SELECT * FROM MyTable WHERE id = '" + id + "';",conn); 
reader = cmd.ExecuteReader();
while (reader.Read())
{
    string dateString= String.Format("{0:MM/dd/yyyy}",((DateTime)reader[columnName]));
}

dateString出来的是“ 01 17 2016” ..不是预期的“ 01/17/2016”

我也尝试过:

string dateString = ((DateTime)reader[columnName]).ToString("MM/dd/yyyy");
string dateString = String.Format("{0:MM/dd/yyyy}",(reader[columnName]));

但是两者的结果都是相同的“ 01 17 2016”,没有正斜杠。

我做的最后一项测试只是将字段转换为不带格式的字符串,结果为“ Sun Jan 17 12:00:00 AM”:

string val = reader[columnName].ToString();

^^我正要问你们到底是怎么回事,然后我想起几天前,我将Windows 7日历“短日期”更改为“ ddd MMM dd”的格式(即单击日历系统托盘并更改日期/时间设置。

我不希望用户的Windows日期/时间格式影响我的C#或sql Server代码中日期和时间显示方式的功能(它会导致很多事情依赖于格式设置)。

我该怎么做才能防止此问题?

解决方法

date format string中,"/"不是文字字符,而是代表the locale's "date separator"

显然,在您的语言环境中,日期分隔符是一个空格。

根据链接的文档,您可以使用单引号将其转义以得到文字斜杠:

string dateString= String.Format("{0:MM'/'dd'/'yyyy}",((DateTime)reader[columnName]));

(它导致许多依赖格式的操作中断)。

那仍然很不好-您应该将形式和功能分开。修复此问题后,您可以以用户最熟悉的格式和期望的格式向用户显示日期。