我有一个日期字符串,就像我认为是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的格式化字符串。
答案 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位数月。