DateTime.ParseExact抛出System.FormatException

时间:2014-07-18 10:47:42

标签: c# datetime

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

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

5 个答案:

答案 0 :(得分:7)

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

来自documentation;

  

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

改为使用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

有关详细信息,请查看;

答案 1 :(得分: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()创建了一个读/写“不变文化”日期/时间信息,您可以为其更改相关属性。

答案 2 :(得分: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);

参考:Custom Date and Time Format Strings

答案 3 :(得分:0)

<强>问题:
您的日期分隔符为.,而字符串格式为/

<强>解决方案:
您的格式应为"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);

OR

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

答案 4 :(得分:0)

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

尝试以下任一方法,它将起作用:)

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