谁能解释为什么下面的代码片段返回 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/