【问题标题】:DateTime ToString broken?DateTime ToString 坏了?
【发布时间】:2020-08-20 14:45:21
【问题描述】:

对于

DateTime aDate = new DateTime(2000,1,1);  
Console.WriteLine(aDate.ToString("d"));

我期待1,但它写的是1/1/2000

MSDN 说:

d 一个月中的第几天,从 1 到 31。

2009-06-01T13:45:30 -> 1

2009-06-15T13:45:30 -> 15

有什么解决方法吗? M 也是如此。

dotnetfiddle

【问题讨论】:

  • 你能试试aDate.ToString("dd")吗?
  • “dd”作品,“01”
  • 这就是你想要的吗?对于一个月,您可以使用 MM。
  • 谢谢,但我不想把“d”作为例外处理,我也使用“dd”、“ddd”和“dddd”,但如果没有解决方案我会这样做

标签: c# datetime .net-core tostring


【解决方案1】:

来自docs

如果使用“d”格式说明符而没有其他自定义格式说明符,则将其解释为“d”标准日期和时间格式说明符。

“d”是The Short Date ("d") Format Specifier

如果您只需要一个月中的哪一天,可以使用DateTime.Day

Console.WriteLine(aDate.Day);

或者,您可以在格式字符串前面加上 %:

Console.WriteLine(aDate.ToString("%d"));

【讨论】:

  • 整个“日期时间格式字符串”的东西,恕我直言,相当混乱。如果您问我,标准日期时间格式说明符甚至不应该作为字符串存在。它们应该是一个枚举,这样可以清楚地区分ToString(string format)ToString(StandardFormats),而且,您不必一次又一次地阅读文档,只需查看枚举名称即可。跨度>
  • @ZoharPeled 同意。
  • 但是,如Aaaaaaaa self answer中所示,这将导致无法在 string.format 中使用....毕竟作为字符串还是可以的
  • 谢谢,@JohnathanBarclay!
  • @ZoharPeled 使用单一方式指定标准或自定义格式也有其好处,尤其是在需要全球化时。拥有一个可以理解两者的机制很方便,并且正如答案中所写,如果需要,可以使用 % 来消除歧义。
【解决方案2】:

您已经创建了 DateTime 对象,因此您可以从 aDate.Day 或 aDate.Month 访问它的属性,如果您想简单地从 datetime 对象中获取 day 属性

Console.WriteLine(aDate.Days.ToString()); // in your case

【讨论】:

    【解决方案3】:

    解决办法是:

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

    : 和 d 之间的空格很重要。 M 也是如此。

    【讨论】:

    • 但这会增加你可能不想要的额外空间,你可以修剪它,但 % 更干净
    【解决方案4】:

    您走在正确的道路上。要只打印当天,您必须改为:

    Console.WriteLine(aDate.ToString("dd"));
    

    这个月应该是:

    Console.WriteLine(aDate.ToString("MM"));
    

    【讨论】:

    • 但是如果 OP 想要使用单个数字怎么办?
    • 那很简单,他必须把那个字符串转换成一个int。
    • 但是他必须将 'd' 作为他试图避免的特殊情况来处理
    • 我不确定我是否理解您要说的内容。你能详细说明一下吗?
    • 想象一下格式不是硬编码的,而是输入的一部分(它可能来自配置文件、用户输入......)。 OP 试图实现的是根据该格式转换日期/时间,但不考虑自定义格式说明符(例如,您的代码不适用于 'dd/MM/yyyy')
    猜你喜欢
    • 2018-08-03
    • 2012-05-22
    • 2013-02-22
    • 2013-04-18
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多