为什么使用格式字符串“Mddyyyy”调用DateTime.TryParseExact失败并输入“1212012”

时间:2012-03-09 23:27:46

标签: c# .net

我有一个日期字符串,就像我认为是Mddyyyy一样。但是,TryParseExact似乎不起作用。以下是失败的示例代码:

string datestring = "1212012";

DateTime td;
if (DateTime.TryParseExact(datestring, "Mddyyyy", new CultureInfo("en-US"),     DateTimeStyles.None, out td))
{
    Console.WriteLine(td.ToShortDateString());
}
else
{
    Console.WriteLine("Invalid Date String");
}

如果有一个前导零,那么相同的代码可以工作,但我认为前导零只适用于MMddyyyy的格式化字符串。

1 个答案:

答案 0 :(得分:3)

我在此提出解释并为该提案提供证据。

建议的解释:解析器在内部使用格式字符串来创建包含贪心量词的正则表达式(这意味着,在这种情况下,它更喜欢将2位数的月份与1位数相匹配个月)。 OP的格式字符串中的M变为类似\d{1,2}(虽然这将匹配从0到99编号的月份!)在解析器的内部正则表达式中。

证据:如果将月份移动到数据和格式字符串的末尾,则贪婪量词不能获得超过1位数,因此它根据需要与月份匹配:

string datestring = "2120121";

DateTime td;
if (DateTime.TryParseExact(datestring, "ddyyyyM", new CultureInfo("en-US"), DateTimeStyles.None, out td))
{
    Console.WriteLine(td.ToShortDateString());
}
else
{
    Console.WriteLine("Invalid Date String");
}

底线:不要依赖未记录的行为。始终使用明确的数据,即2位数月。