日期时间解析格式异常

3
为什么以下代码会产生FormatException异常?
DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", null);

DateTime.ParseExact

也许这与代码在作为MVC3站点执行逻辑的一部分在IIS 7.5 Express下运行有关?


2
我在 LinqPad 上运行它,没有任何问题。 - Mario J Vargas
如果您要提供定义的转换模式,请尝试指定不变的文化,或者提供与运行线程文化更一致的模式。 - Tetsujin no Oni
我已经添加了我的案例的证明图片 =) - Maxim V. Pavlov
我知道它可以使用InvariantCulture。我想知道为什么这个特定的情况会抛出异常。 - Maxim V. Pavlov
InvariantCulture提供了一个默认的日期格式,该格式与您提供的日期字符串匹配。您运行此代码的计算机的文化设置是什么?它的日期格式显然与您在语句中提供的不同。您语句中的null格式提供程序值使.NET使用计算机的日期格式(文化信息)作为默认值。 - leanne
谢谢你的解释。技术上来说,斜杠应该是与文化相关的,正如Darjan所提到的那样。除此之外,我可以看到我提供了足够的信息给CLR对象,以便知道要分配给结果日期时间对象的Day、Month和Year属性的值是什么。 - Maxim V. Pavlov
3个回答

5
您需要包含CultureInfo,例如:
DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", new CultureInfo("en-US"));

格式字符串中的反斜杠是与文化有关的,如果你不传入CultureInfo,则会使用当前的文化。你也可以使用 CultureInfo.InvariantCulture,这也可以起作用。 Jon Skeet在这里提供了一些详细的解释。


原始方法调用依赖于 CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator,它可能是 /-. 等等。如果您想使用一个字面上的斜杠,并且不想使用 InvariantCulture,请转义斜杠,例如 DateTime.ParseExact("03/01/2012", @"dd\/MM\/yyyy", null); - Jeppe Stig Nielsen

4
取决于您的文化,将其排除在外......
DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", CultureInfo.InvariantCulture);

3
根据文档,如果出现以下情况之一,会抛出FormatException异常:
public static DateTime ParseExact(
    string s,
    string format,
    IFormatProvider provider
) 
  • 如果字符串s或格式化字符串format为空,则返回空字符串。
  • 如果字符串s不包含与格式指定的日期和时间相对应的模式,则返回空字符串。
  • 字符串s中的小时组件和AM/PM指示符不一致,则返回空字符串。

如果传入null的IFormatProvider,它将默认使用当前线程的区域设置。我需要在Reflector中查看这个。你为什么想传入null呢?

更新:

我在.NET Reflector中查看了它,并且默认为当前线程的DateTimeFormatInfo。我不知道是否允许在此处发布代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接