我有一个快速的函数来格式化日期,这里是:
public static string archiveServerDateTime(string datetime)
{
DateTime tempDateTime = DateTime.ParseExact(datetime,"dd.MM.yyyy HH:mm:ss", null);
return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss");
}
只找到函数的输出= 2009.10.22:16:21:03,令人惊讶的是这只是在1台生产服务器上,测试服务器工作得非常好......
所以现在我把这个功能重写为旧式风格:
public static string archiveServerDateTime(string datetime)
{
DateTime tempDateTime = DateTime.ParseExact(datetime,"dd.MM.yyyy HH:mm:ss", null);
string yearPart = Convert.ToString(tempDateTime.Year);
string monthPart = Convert.ToString(tempDateTime.Month).PadLeft(2,'0');
string dayPart = Convert.ToString(tempDateTime.Day ).PadLeft(2, '0');
string hourPart = Convert.ToString(tempDateTime.Hour).PadLeft(2, '0');
string minutePart = Convert.ToString(tempDateTime.Minute).PadLeft(2, '0');
string secondPart = Convert.ToString(tempDateTime.Second).PadLeft(2,'0');
return yearPart + @"/" + monthPart + @"/" + dayPart + ":" + hourPart + ":" + minutePart + ":" + secondPart;
//return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss");
}
所以我问女士们,先生们,我是否先取代完美的代码,或者这是某种微软的错误?我们真的可以相信这些看起来不那么坚固的新语言功能,或者我只是错过了什么?
答案 0 :(得分:26)
您应该将DateTimeFormatInfo.InvariantInfo
作为参数传递给DateTime.ToString
方法。格式字符串中的/
始终不表示"/"
字符。它解析为当前文化的日期分隔符:
return tempDateTime.ToString("yyyy/MM/dd:HH:mm:ss", DateTimeFormatInfo.InvariantInfo);
一般而言,始终使用ToString
和Parse
方法(不仅仅是DateTime
s)明确指定文化,这是一种很好的做法。 FxCop(VS代码分析)具有在不执行此操作时吐出警告的规则。这对非美国文化至关重要,许多程序员经常低估其重要性。
答案 1 :(得分:4)
可能是区域设置问题。例如。一些国家使用点作为日期分隔符。
编辑:这是一个区域设置问题。我刚刚在具有德语语言环境的机器上尝试了您的格式字符串,它正在生成2009.10.31