C# DateTime.ParseExact抛出System.FormatException

C# DateTime.ParseExact抛出System.FormatException,c#,datetime,C#,Datetime,为什么这行代码有时会抛出System.FormatException DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.InvariantCulture); 因为您的字符串和格式不匹配 来自 将日期和时间的指定字符串表示形式转换为其 使用指定格式和特定区域性的DateTime等效项 格式信息字符串表示形式的格式必须匹配 指定的格式完全相同。 改用dd.MM.yyyy格式 DateTime d = D

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

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

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

来自

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

改用
dd.MM.yyyy
格式

DateTime d = DateTime.ParseExact("01.07.2014",
                                 "dd.MM.yyyy",
                                 CultureInfo.InvariantCulture); 
这里有一个

记住,在自定义日期和时间格式中具有特殊含义。它的意思是:;用当前区域性日期分隔符替换我

在你的个人资料中,它说你来自阿塞拜疆。这意味着你可能是
az-Cyrl-az
(西里尔语,阿塞拜疆)或
az-Latn-az
(拉丁语,阿塞拜疆)

实际上,在本例中使用哪种文化并不重要,因为这两种文化都有
作为一个整体

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

DateTime d = DateTime.ParseExact("01.07.2014",
                                 "dd/MM/yyyy",
                                 CultureInfo.CurrentCulture); 
                                 // or you can use null
有关更多信息,请查看

    • 问题:
      日期中的分隔符是
      ,而字符串格式中的分隔符是
      /

      解决方案:
      您的格式应该是
      “dd.MM.yyyy”
      “MM.dd.yyyy”
      ,因为您的日期是
      “01.07.2014”
      <代码>01和
      07
      同时作为日期和月份存在

      该日期可以是
      2014年7月1日
      2014年1月7日

      你的代码应该是

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


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

      例如:

      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);
      

      参考:

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

      请尝试以下任一项,它将起作用:)


      您需要一个区域性,其中
      日期分隔符,例如:

      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”

      “不变区域性”使用
      “/”
      作为其
      日期分隔符,因此您不应该在您的案例中使用它

      此外,这项工作:

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

      因为
      new DateTimeFormatInfo()
      生成一个读/写“不变区域性”日期/时间信息,您可以为其更改相关属性。

      包含“/”的内容与包含“.”的内容如何匹配?你试过什么吗?有时候这段代码不会抛出任何异常。阅读下面的一些答案。谢谢。“az Latn az”-这一个更有用,因为我们现在使用拉丁语。@gdrt94很棒。两者都有相同的
      日期分隔符
      如果已知您的应用程序总是使用
      “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中更改了设置)就不会破坏您的代码。
      DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
          null);
      
      DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
          new DateTimeFormatInfo { DateSeparator = ".", }
          );