DateTime.ParseExact抛出了System.FormatException异常。

4
为什么这行代码有时候会抛出System.FormatException异常?
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);

包含'/'的东西如何匹配包含'.'的东西?你试过吗? - flindeberg
有时,这段代码不会抛出任何异常。请阅读以下答案中的一些内容。 - gdrt
5个回答

7
因为你的字符串和格式不匹配。
来自文档
将指定的日期和时间字符串表示转换为其DateTime等效项,使用指定的格式和特定于文化的格式信息。字符串表示的格式必须与指定的格式完全匹配。
改用dd.MM.yyyy格式。
DateTime d = DateTime.ParseExact("01.07.2014",
                                 "dd.MM.yyyy",
                                 CultureInfo.InvariantCulture); 

这里有一个演示.

请记住,在自定义日期和时间格式中,"/" 自定义格式说明符具有特殊含义。它表示; 使用当前区域设置的日期分隔符替换我

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

实际上,在此情况下使用哪种区域设置并不重要,因为两种区域设置都将.作为DateSeparator属性

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

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

了解更多信息,请查看以下链接:


3

您需要一种文化,其中"."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" - 这个更有用,因为我们现在使用拉丁字母表。 - gdrt
@gdrt94 很好。两者都具有相同的 DateSeparator"." 如果您的应用程序已知始终使用 "az-Latn-AZ",则可以只键入 null。如果当前文化可能是任何内容,则编写 new CultureInfo("az-Latn-AZ") - Jeppe Stig Nielsen
1
实际上,我只是将 new CultureInfo("az-Cyrl-AZ") 更改为 CultureInfo.GetCultureInfo("az-Cyrl-AZ"),原因有两个:(1) 您不需要每次创建一个新的 CultureInfo 实例(在使用后变成垃圾),而是从缓存中选择实例。(2) 您可以获得一个 UseUserOverride 设置为 False 的实例,这样具有另一种日期分隔符偏好的用户(已在其计算机上更改了 Windows 设置)将不会破坏您的代码。 - Jeppe Stig Nielsen

1
日期格式中的/将匹配您指定的文化中的日期分隔符。如果使用具有句点作为日期分隔符的文化,则解析将起作用。
示例:
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);

参考: 自定义日期和时间格式字符串


1
你拥有的格式与提供的字符串不同:
尝试以下任意一种方式,它会起作用 :)
DateTime d1 = DateTime.ParseExact("01/07/2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);
DateTime d2 = DateTime.ParseExact("01.07.2014", "dd.MM.yyyy", CultureInfo.InvariantCulture);

0

问题:
你的日期分隔符是“.”,而在字符串格式中它是“/”

解决方案:
你的格式应该是"dd.MM.yyyy""MM.dd.yyyy",因为你的日期是"01.07.2014"0107都存在于日期和月份中。

这个日期可以是“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", 
                                 "MM.dd.yyyy", 
                                 CultureInfo.InvariantCulture);

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