【问题标题】:DateTime.ToString can return different results for same format specifierDateTime.ToString 可以为相同的格式说明符返回不同的结果
【发布时间】:2016-02-20 08:05:31
【问题描述】:

我对 DateTime 格式字符串中的“d”说明符有疑问。 MSDNsays:

“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".

为什么结果字符串取决于格式字符串长度?我该如何避免这种情况?

【问题讨论】:

    标签: c# datetime


    【解决方案1】:

    因为作为单个字符,它的行为类似于The "d" standard format specifier,它返回CurrentCulture 中的ShortDatePattern(对于您的设置,它看起来像是M/d/yyyy)但是如果有空格,它的行为就像The "d" custom format specifier,它返回天个位数天数不带前导零的数字。

    来自The "d" Custom Format Specifier

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用DateTime 类中的Day 属性避免此问题

      Console.WriteLine(date1.Day.ToString());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多