DateTime自定义格式不符合预期

时间:2011-10-05 15:02:26

标签: c# datetime string-formatting

我一直在使用自定义格式显示日期时间,如下所示:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

e.g。

new DateTime(2011,10,5).ToString("dd");

返回:"05"

new DateTime(2011,10,5).ToString("d MM");

返回"5 10"

这两者都是我所期望的,但是:

new DateTime(2011,10,5).ToString("d");

返回:"05/10/2011"

当我希望它返回时:"5"

这在实践中并不重要,因为您会使用:new DateTime(2011,10,5).Day来获取当天,但我对自定义格式无法正常工作的原因感兴趣。

2 个答案:

答案 0 :(得分:5)

请尝试阅读Standard Date and Time Format Strings "d" Short date pattern.。是的,重用d :-)可能有点愚蠢,幸运的是它是一个极端的案例。

一般情况下,对于未输入/输出给用户的内容,您应始终使用CultureInfo.InvariantCulture,除非您确切知道自己在做什么,并且知道您的程序不会在国外销售。因此,如果您要向用户显示日期,请使用他的文化/当地文化。如果您要向用户询问相同的日期。但是,如果您使用日期来命名文件或进行一些内部操作,通常最好使用CultureInfo.InvariantCulture

试试这个:

Console.WriteLine(DateTime.Now.ToString("MM", new System.Globalization.CultureInfo("ar-SA")));
Console.WriteLine(DateTime.Now.ToString("yyyy", new System.Globalization.CultureInfo("ar-SA")));

Console.WriteLine(DateTime.Now.ToString("MM", System.Globalization.CultureInfo.InvariantCulture));
Console.WriteLine(DateTime.Now.ToString("yyyy", System.Globalization.CultureInfo.InvariantCulture));

告诉我你的看法: - )

答案 1 :(得分:4)

正如xanatos所说,它将“d”视为标准的日期和时间格式字符串。

如果你想要一个只有“d”的自定义日期和时间格式字符串,你需要有效地逃避它,说“不要把它当作标准模式!”

new DateTime(2011, 10, 5).ToString("%d");

这里的%是“从标准转为自定义”部分。

使用单个自定义格式说明符“Custom Date and Time Format Strings documentation,sectino”:

  

自定义日期和时间格式字符串由两个或多个字符组成。日期和时间格式化方法将任何单字符字符串解释为标准日期和时间格式字符串。如果他们不将该字符识别为有效的格式说明符,则会抛出FormatException。例如,仅由说明符“h”组成的格式字符串被解释为标准日期和时间格式字符串。但是,在这种特殊情况下,抛出异常,因为没有“h”标准日期和时间格式说明符。

     

使用任何自定义日期和时间格式说明符作为格式字符串中的唯一说明符(即使用“d”,“f”,“F”,“g”,“h”,“ H“,”K“,”m“,”M“,”s“,”t“,”y“,”z“,”:“或”/“自定义格式说明符),包括之前的空格或在说明符之后,或在单个自定义日期和时间说明符之前包含百分比(“%”)格式说明符。

     

例如,“%h”被解释为自定义日期和时间格式字符串,显示当前日期和时间值表示的小时。您也可以使用“h”或“h”格式字符串,但这会在结果字符串中包含空格以及小时。