2011-10-05 114 views
2

我一直在使用,用于显示DateTime是否自定义格式已为在这里找到:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx日期时间自定义格式并不如预期

例如

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得到一天,但我很感兴趣,为什么自定义格式没有按照我预料的那样工作。

回答

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

那么,* * *不变的文化*或*预期对用户有效的标准格式:) –

+0

@JonSkeet正如你所说,但对于“服务器”部分,我认为使用“本地”年可能是一个有点复杂....和成熟的bug :-)(所以如果你有命名基于当前日期的文件时,它可能会更好使用InvariantCulture的) – xanatos

+0

有关命名一个文件,我完全同意。但你确实说“一般”:) –

4

正如萨那托斯说,它的治疗“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”格式的字符串,尽管这包括结果字符串中的空格以及小时。

+1

@xanatos:编辑了一个链接和一些文档的答案。 –