我有一个日期字符串,我认为它是 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。
最佳答案
在此我提出一个解释并为该提议提供证据。
建议的解释:解析器在内部使用格式字符串来创建一个包含贪婪量词的正则表达式(这意味着,在这种情况下,它更喜欢匹配 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 位数的月份。
关于c# - 为什么使用格式字符串 "1212012"调用 DateTime.TryParseExact 会因输入 "Mddyyyy"而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9642342/