为什么DateTime.ToString("h")会导致异常?

Mar*_*ici 21 c# datetime

打开一个观察窗口

new DateTime(2010,01,01).ToString("h")
Run Code Online (Sandbox Code Playgroud)

得到:

new DateTime(2010,01,01).ToString("h") 抛出了类型的例外 System.FormatException

然而...

new DateTime(2010,01,01).ToString("h ")
Run Code Online (Sandbox Code Playgroud)

给:"12"

那么为什么额外的空间会阻止这种格式异常的发生呢?这是一个错误吗?

Jon*_*eet 43

这是因为它认为这是一个标准格式字符串代替的定制一个,由于是单个字符.

解决这个问题的更好方法是使用%:

string text = DateTime.Now.ToString("%h");
Run Code Online (Sandbox Code Playgroud)

从自定义格式字符串的文档:

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

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

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