c# - 为什么使用格式字符串 "1212012"调用 DateTime.TryParseExact 会因输入 "Mddyyyy"而失败

标签 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。

最佳答案

在此我提出一个解释并为该提议提供证据。

建议的解释:解析器在内部使用格式字符串来创建一个包含贪婪量词的正则表达式(这意味着,在这种情况下,它更喜欢匹配 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/

相关文章:

c# - 从 SQL Server 切换到 Versant OODB 的好处

c# - 通过 C# 代码复制数据库对象

c# - Core 3.0 中的 Process.Start 不会仅通过名称打开文件夹

.net,Login.aspx,无法显示<img>标签?

c# - 自动调整文本 block 大小

c# - 在 Windows 8 上获取操作系统、平台和设备信息

c# - 从扩展方法动态添加新的对象属性

c# - 对象内存优化问题

.net - 如何使用 Linq 将实体表与交叉引用表连接起来

.net - TransformBlock 发布到输出