【问题标题】:DateTime.ParseExact throws System.FormatExceptionDateTime.ParseExact 抛出 System.FormatException
【发布时间】:2014-07-18 10:47:41
【问题描述】:

为什么这行代码有时会抛出System.FormatException

DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);

【问题讨论】:

  • 包含 '/' 的内容如何匹配包含 '.' 的内容?你有没有尝试过?
  • 有时这段代码不会抛出任何异常。阅读下面的一些答案。

标签: c# datetime


【解决方案1】:

因为你的字符串和格式不匹配。

来自documentation

将日期和时间的指定字符串表示形式转换为其 使用指定格式和特定​​区域性的等效日期时间 格式信息。 字符串表示的格式必须匹配 完全符合指定的格式。

改用dd.MM.yyyy 格式。

DateTime d = DateTime.ParseExact("01.07.2014",
                                 "dd.MM.yyyy",
                                 CultureInfo.InvariantCulture); 

这里是 demonstration

请记住,"/" custom format specifier 在自定义日期和时间格式中具有特殊含义。它的意思是; 用当前的文化日期分隔符替换我

在您的个人资料中,显示您来自阿塞拜疆。这意味着您的CurrentCulture 可能是az-Cyrl-AZ(西里尔文,阿塞拜疆)或az-Latn-AZ(拉丁文,阿塞拜疆)。

实际上,在这种情况下您使用哪种文化并不重要,因为两种文化都有. 作为DateSeparator property

这意味着您的原始代码也适用于您的CurrentCulture

DateTime d = DateTime.ParseExact("01.07.2014",
                                 "dd/MM/yyyy",
                                 CultureInfo.CurrentCulture); 
                                 // or you can use null

欲了解更多信息,请查看;

【讨论】:

    【解决方案2】:

    您需要一种文化,其中"."DateSeparator,例如:

    DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
        CultureInfo.GetCultureInfo("az-Cyrl-AZ"));
    

    如果您在阿塞拜疆并且使用带有西里尔字母的阿塞拜疆语言。

    你可以使用:

    DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
        null);
    

    仅采用当前文化。

    也许您只需要"d" 而不是冗长的"dd/MM/yyyy",因为阿塞拜疆的标准短日期格式就像"01.07.2014"

    “不变文化”使用"/" 作为其DateSeparator,因此您不应在您的情况下使用它。

    另外,这可行:

    DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
        new DateTimeFormatInfo { DateSeparator = ".", }
        );
    

    因为new DateTimeFormatInfo() 制作了一个读/写“不变文化”日期/时间信息,您可以更改其相关属性。

    【讨论】:

    • 谢谢。 “az-Latn-AZ” - 这个更有用,因为我们现在使用拉丁文字。
    • @gdrt94 太好了。两者都具有相同的DateSeparator"." 如果已知您的应用程序始终使用"az-Latn-AZ",则只需键入null。如果当前文化存在风险,请写出new CultureInfo("az-Latn-AZ")
    • @gdrt 实际上我只是将new CultureInfo("az-Cyrl-AZ") 更改为CultureInfo.GetCultureInfo("az-Cyrl-AZ") 有两个原因:(1)您不会每次都创建CultureInfo 的新实例(使用后立即成为垃圾)而是从缓存中选择实例。 (2) 你得到一个UseUserOverride 设置为 False 的实例,这样一个对日期分隔符有另一个偏好的用户(他在他的机器上更改了 Windows 中的设置)不会破坏你的代码。
    【解决方案3】:

    日期格式中的/ 将匹配您指定的区域性的日期分隔符。如果您使用具有句点作为日期分隔符的区域性,则解析将起作用。

    例子:

    DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.GetCultureInfo("de"));
    

    您也可以使用文字句点代替特定的日期分隔符,然后它适用于不变的文化:

    DateTime d = DateTime.ParseExact("01.07.2014", "dd.MM.yyyy", CultureInfo.InvariantCulture);
    

    参考:Custom Date and Time Format Strings

    【讨论】:

      【解决方案4】:

      您的格式与提供的字符串不同:

      尝试以下任何一种方法,它都会起作用:)

      DateTime d1 = DateTime.ParseExact("01/07/2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);
      DateTime d2 = DateTime.ParseExact("01.07.2014", "dd.MM.yyyy", CultureInfo.InvariantCulture);
      

      【讨论】:

        【解决方案5】:

        问题:
        日期分隔符为.,而字符串格式为/

        解决方案:
        您的格式应为"dd.MM.yyyy""MM.dd.yyyy",因为您的日期为"01.07.2014"0107 同时存在日期和月份。

        此日期可以是01st July 201407 Jan 2014

        你的代码应该是

        DateTime d = DateTime.ParseExact("01.07.2014", 
                                         "dd.MM.yyyy", 
                                         CultureInfo.InvariantCulture);
        

        DateTime d = DateTime.ParseExact("01.07.2014", 
                                         "MM.dd.yyyy", 
                                         CultureInfo.InvariantCulture);
        

        【讨论】:

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