【问题标题】:Why can't DateTime.ParseExact() parse "9/1/2009" using "M/d/yyyy"为什么 DateTime.ParseExact() 不能使用“M/d/yyyy”解析“9/1/2009”
【发布时间】:2010-11-25 00:20:51
【问题描述】:

我有一个如下所示的字符串:“9/1/2009”。我想将其转换为 DateTime 对象(使用 C#)。

这行得通:

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

但我不明白为什么这不起作用:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

日期中没有单词(如“September”),而且我知道具体格式,所以我宁愿使用 ParseExact(我不明白为什么需要 CultureInfo)。但我不断收到可怕的“字符串未被识别为有效的日期时间”异常。

谢谢

稍作跟进。以下是 3 种可行的方法:

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

这里有 3 个不起作用:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

所以,Parse() 适用于“en-US”,但不适用于 ParseExact... 出乎意料?

【问题讨论】:

  • 您使用的是什么版本的 .NET?当我在 Win7 上的 PowerShell v2 中执行上面的第二行时,它工作得很好。
  • 我在 xp 上使用 .net 3.5。默认区域性为 en-us。
  • 在字符串 "M/d/yyyy" 中,每个斜线 / 都替换为 culture.DateTimeFormat.DateSeparator 字符串。当您将null 作为格式提供者时,将使用当前文化。现在取决于当前文化是否有"/" 或其他字符串(如"-"".")作为其DateSeparator

标签: .net datetime parsing cultureinfo


【解决方案1】:

试试:

在网页配置文件中配置

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

例如:DateTime dt = DateTime.ParseExact("08/21/2013", "MM/dd/yyyy", null);

参考网址:http://support.microsoft.com/kb/306162/

【讨论】:

  • 此问题中没有任何内容表明 Web 应用程序。
【解决方案2】:

将 DateTimePicker 的 Format 属性设置为 custom,将 CustomFormat 属性设置为 M/dd/yyyy

【讨论】:

  • 这个问题和 DateTimePicker 完全没有关系。
【解决方案3】:

我在 XP 上试过,如果 PC 设置为国际时间 yyyy-M-d,它就不起作用。在该行上放置一个断点并在处理之前更改日期字符串以使用“-”代替“/”,您会发现它有效。您是否拥有 CultureInfo 没有任何区别。 能够指定一个 expercted 格式只是忽略分隔符似乎很奇怪。

【讨论】:

    【解决方案4】:

    我怀疑问题出在格式字符串中的斜杠与数据中的斜杠之间。这是格式字符串中对文化敏感的日期分隔符,最后一个参数是 null 表示“使用当前文化”。如果您或者转义斜线(“M'/'d'/'yyyy”)指定CultureInfo.InvariantCulture,就可以了。

    如果有人有兴趣复制这个:

    // Works
    DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
                                      new CultureInfo("de-DE"));
    
    // Works
    DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                      new CultureInfo("en-US"));
    
    // Works
    DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                      CultureInfo.InvariantCulture);
    
    // Fails
    DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                      new CultureInfo("de-DE"));
    

    【讨论】:

    • 你是对的,其中任何一个都可以。我不确定我更喜欢哪一个。我想逃避斜线更紧凑......谢谢,这一直困扰着我一段时间!
    • 我不确定为什么您的第二个示例对您有用。这对我不起作用。使用 CultureInfo("en-US") 与 Parse() 一起使用此日期字符串,但不适用于 ParseExact 与此日期字符串和格式字符串。
    • @Jimmy:这取决于意图。在这种情况下,/ 用作精确斜杠,而 not 用作区分区域性的分隔符(即使区域性为 InvariantCulture),因此更好地表达您的意图的选项是带引号的选项斜线(你选择的那个)。
    • @Jon DateTime.ParseExact 参数之一是CultureInfo。所以如果我写 :new CultureInfo("de-DE") ,这意味着我知道该日期与. 分开。那么为什么我还需要写格式:M/d/yyyy 而不是M.d.yyyy?我们不是说我知道日期与. 分开吗?我很难理解。如果我通过它的文化认出某样东西,我就会确切地知道它应该是什么样子。 但是如果你告诉我,用户输入了9@@1@@2009,那么我会说 - 很好。让我们使用 parseExact。但是我不需要文化。你能帮忙吗?
    • @RoyiNamir:对不起,我真的不明白你在问什么。
    【解决方案5】:

    我敢打赌,您机器的文化不是“en-US”。来自the documentation

    如果 provider 是空引用(在 Visual Basic 中为 Nothing),则使用当前区域性。

    如果您当前的文化不是“en-US”,这可以解释为什么它对我有效,但对您无效并且在您明确指定文化为“en-美国”。

    【讨论】:

    • 不,有趣的是,CultureInfo.CurrentCulture 确实返回“en-us”......所以我不知道如何解释为什么它对你有用,但对我没用。
    • 我尝试了一些东西。这是有效的: DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null); DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); DateTime.Parse("9/1/2009", new CultureInfo("en-US"));以下是不起作用的: DateTime.ParseExact(dateString, "M/d/yyyy", CultureInfo.CurrentCulture); DateTime.ParseExact(dateString, "M/d/yyyy", new CultureInfo("en-US")); DateTime.ParseExact(dateString, "M/d/yyyy", null);所以 Parse() 与“en-US”一起工作,但不是 ParseExact ...有趣吧?
    【解决方案6】:

    试试

    Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))
    

    【讨论】:

    • 我想我宁愿使用 DateTime.Parse("9/1/2009", new CultureInfo("en-US")) 那么,如果我必须指定文化...... ?
    • 不是每次解析日期时都实例化 CultureInfo("en-US") 的新实例,而是使用 CultureInfo.InvariantCulture。
    • 实际上这不起作用(至少对我来说?)使用“en-US”适用于 Parse,但不适用于 ParseExact(对于这个日期和格式字符串)
    【解决方案7】:

    试试这个

    provider = new CultureInfo("en-US");
    DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);
    

    再见。

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2010-09-19
      • 2016-09-04
      • 1970-01-01
      • 2015-11-10
      相关资源
      最近更新 更多