c# - DateTime.TryParseExact 未按预期工作

标签 c# datetime tryparse

谁能解释为什么下面的代码片段返回 true?

根据 The "d" custom format specifier 的文档, "个位数的日期格式不带前导零。"那么,当我给它一个带前导零的个位数日时,为什么 TryParseExact 不会失败?

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

更新

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

文档的相关片段是:

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

  • 来自 The 'd' Specifier : 单位数天的格式不带前导零。

在我看来,'01' 有一个前导 0,因此并不完全匹配 'd',这似乎非常清楚。

最佳答案

来自 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
    {...}

解析器将“d”和“dd”混为一谈。

关于c# - DateTime.TryParseExact 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5905728/

相关文章:

c# - Winforms 选择哪种设计模式/敏捷方法论

java - 如何本地化 Java Calendar 类?

javascript - 如何从javascript中的对象中删除时间?

c# - 为什么 C# TryParse 不处理 NaN?

c# - Task.Delay(0) 和 Task.FromResult(0) 有替代方案吗?

c# - 获取 FrameworkElement 边界矩形的坐标

bash - 在 bash 中创建将运行特定时间的 while 循环

c# - 将 TryParse 与 double 一起使用显示过载错误?

c# - TryParse 其他类型

c# - 刷新更新面板后重定向