DateTime.ToString可以为相同的格式说明符返回不同的结果

时间:2016-02-20 08:05:31

标签: c# datetime

我在DateTime格式字符串中遇到'd'说明符问题。 MSDN says

  

“d”自定义格式说明符将月中的日期表示为1到31之间的数字。一位数字日的格式不带前导零。

如果我将此格式说明符与格式字符串中的其他符号一起使用,结果将是正确的:

DateTime date1 = new DateTime(2008, 1, 2, 6, 30, 15);
Console.WriteLine(date1.ToString("d ")); //with space after 'd'
//displays: 2 

但如果我从此示例中删除空格

Console.WriteLine(date1.ToString("d"));

结果变为"1/2/2008".

为什么结果字符串取决于格式字符串长度?我怎么能避免这个?

2 个答案:

答案 0 :(得分:7)

因为作为单个字符,它的行为为The "d" standard format specifier,返回CurrentCulture的{​​{3}}(对于您的设置看起来像M/d/yyyy)但是有空格,表现为ShortDatePattern,它返回单日数字不带前导零的日期数字。

来自The "d" custom format specifier

  

如果使用"d"格式说明符而没有其他自定义格式   说明符,它被解释为The "d" Custom Format Specifier   符。有关使用单个格式说明符的更多信息,   请参阅本主题后面的The "d" standard date and time format

使用单一自定义格式说明符

  

自定义日期和时间格式字符串由两个或更多个组成   字符即可。日期和时间格式化方法解释任何   单字符串作为标准日期和时间格式字符串。如果   它们不会将字符识别为有效的格式说明符   扔一个FormatException。例如,包含的格式字符串   只有说明者" h"被解释为标准日期和时间   格式字符串。但是,在这种特殊情况下,例外情况是   抛出因为没有" h"标准日期和时间格式   说明符。

     

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

答案 1 :(得分:0)

您可以使用Day

中的DateTime属性来避免此问题
Console.WriteLine(date1.Day.ToString());