【问题标题】:Why can’t DateTime.ParseExact() parse the AM/PM in “4/4/2010 4:20:00 PM” using “M'/'d'/'yyyy H':'mm':'ss' 'tt”为什么 DateTime.ParseExact() 不能使用“M'/'d'/'yyyy H':'mm':'ss'' 解析“4/4/2010 4:20:00 PM”中的 AM/PM tt”
【发布时间】:2017-10-17 17:35:32
【问题描述】:

我正在使用 c#,如果我这样做了

DateTime.ParseExact("4/4/2010 4:20:00 PM", "M'/'d'/'yyyy H':'mm':'ss' 'tt", null)

返回值始终是凌晨 4:20 -- 我在使用 tt 时做错了什么?

谢谢!

【问题讨论】:

  • 几个正确答案...既然我只能选择一个正确答案,我假设我应该选择第一个提交?

标签: c# datetime parsing


【解决方案1】:

将小时格式 (H) 设为小写,如下所示:

DateTime.ParseExact(
            "4/4/2010 4:20:00 PM", 
            "M/d/yyyy h:mm:ss tt", 
            CultureInfo.InvariantCulture);

大写的“H”表示 24 小时制,小写的“h”表示 12 小时制,将遵循候选字符串中的 AM/PM。

旁注:最好为这样的方法提供IFormatProvider 的实例(即使它只是CultureInfo.InvariantCulture)。在您遇到问题之前,它是无关紧要的事情之一,因此养成指定文化信息的习惯会很好。

【讨论】:

  • 感谢旁注!我在另一个问题中讨论了这个问题:@Jimmy:这取决于意图。在这种情况下,/ 用作精确的斜杠而不是文化敏感的分隔符(即使文化是 InvariantCulture),所以更好地表达您的意图的选项是带有引号的斜杠(您选择的那个)-@ 987654321@。当时我同意他的结论(即,使用“/”和 null 作为文化,而不是使用 CultureInfo.InvariantCulture)。你怎么看?
  • 太棒了!在我的情况下缺少 CultureInfo.InvariantCulture,因为我有一个小写的“h”,但它仍然没有解析!
【解决方案2】:

尝试以下方法:

Console.WriteLine(DateTime.ParseExact("4/4/2010 4:20:00 PM", "M'/'d'/'yyyy h':'mm':'ss tt", null));

这个输出:

 4/4/2010 4:20:00 PM

【讨论】:

    【解决方案3】:

    您需要为格式字符串中的小时参数使用小写的“h”。大写的“H”代表 24 小时制,因此“4”被识别为凌晨 4 点(因为“16”是下午 4 点)。

    DateTime.ParseExact("4/4/2010 4:20:00 PM", "M/d/yyyy h:mm:ss:tt", null)
    

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多