DateTime.TryParseExact未按预期工作

ver*_*ald 11 c# datetime tryparse

任何人都可以解释为什么以下片段返回true?

根据"d"自定义格式说明符的文档,"一位数字日的格式没有前导零." 那么为什么当我给一个前导零的一位数日时,TryParseExact不会失败?

DateTime x;
return DateTime.TryParseExact
(
    "01/01/2001",
    @"d\/MM\/yyyy",
    null,
    System.Globalization.DateTimeStyles.None,
    out x
);
Run Code Online (Sandbox Code Playgroud)

UPDATE

我想也许我原本不清楚.我真正想要的是:为什么TryParseExact接受一些不完全匹配的值?从我看到的所有文档中,'d'匹配'01'和'1'就像'MM'匹配'March'和'03'一样.这里的问题不是值是等价的,它们与格式不匹配.

相关的文档片段是:

  • 来自TryParseExact:字符串表示的格式必须与指定的格式完全匹配.

  • 来自'd'说明符:一位数字日的格式没有前导零.

我似乎非常清楚'01'有一个前导0,因此不完全匹配'd'.

sea*_*rth 8

从DateTimeParse.ParseByFormat()中的.NET 4源代码:

case 'd':
    // Day & Day of week 
    tokenLen = format.GetRepeatCount();
    if (tokenLen <= 2) { 
        // "d" & "dd" 

        if (!ParseDigits(ref str, tokenLen, out tempDay)) { 
            if (!parseInfo.fCustomNumberParser ||
                !parseInfo.parseNumberDelegate(ref str, tokenLen, out tempDay)) {

                result.SetFailure(ParseFailureKind.Format, "Format_BadDateTime", null);
                return (false); 
            }
        } 
        if (!CheckNewValue(ref result.Day, tempDay, ch, ref result)) { 
            return (false);
        }
    }
    else
    {...}
Run Code Online (Sandbox Code Playgroud)

解析器将"d"和"dd"整合在一起.

  • 如果您想知道,.NET代码(Microsoft共享的那部分)可以在http://referencesource.microsoft.com/netframework.aspx](http://referencesource.microsoft.com/netframework)免费获得. ASPX) (2认同)

Bal*_*a R 0

TryParseExact我想在这种情况下只是想保持灵活性。但是,当您使用格式说明符将日期转换为字符串时,“d”与“dd”应该并且会像所宣传的那样工作。

  • 与只有 Parse 和 TryParse 的数字数据类型不同,日期是一种奇怪的类型,因为它可以具有所有不同的格式。Parse 试图猜测它,但 ParseExact 在那里,所以你可以说 01/02/2001 是 mm/dd/yyyy 而不是 dd/mm/yyyy。它所允许的灵活性不会对任何情况造成伤害,所以我不认为这是一个错误,而且这完全是故意的,你不觉得吗? (2认同)