C# 如果日期字符串与格式字符串匹配,则DateTime.TryParseExact返回true

C# 如果日期字符串与格式字符串匹配,则DateTime.TryParseExact返回true,c#,datetime,C#,Datetime,在运行单元测试以确保传入无效的datetime格式sting时api的正确响应时遇到问题。当传入日期字符串“0711”和格式“0711”时,api没有返回错误,而是将该日期设置为今天 DateTime.TryParseExact("1019", "1019", null, System.Globalization.DateTimeStyles.AssumeLocal, out result) DateTime.TryParseExact("1a111", "1a111", null, Syst

在运行单元测试以确保传入无效的datetime格式sting时api的正确响应时遇到问题。当传入日期字符串“0711”和格式“0711”时,api没有返回错误,而是将该日期设置为今天

DateTime.TryParseExact("1019", "1019", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)

DateTime.TryParseExact("1a111", "1a111", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)
例如,下面的示例-DateTime.TryParseExact()返回true,将日期设置为今天

DateTime.TryParseExact("1019", "1019", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)

DateTime.TryParseExact("1a111", "1a111", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)
如果字符串不匹配 乙二醇

这将正确返回false

这是预期的行为吗?如果是这样的话,canyone能解释内部运作吗? 除了检查字符串是否匹配之外,还有什么可靠的方法可以缓解这种情况

这是预期的行为吗

如果是这样的话,有人能解释一下内部工作原理吗

您输入的数字只是作为文本读取,它们确实匹配。解析字符串中没有
HH
mm
或类似标识符,因此没有要解析的实际日期。它默认为
DateTime.Now

除了检查字符串是否相互匹配之外,还有什么可靠的方法可以缓解这种情况


使用实际的日期-时间格式字符串,如“所有其他字符始终被解释为字符文字,在格式化操作中,结果字符串中包含的字符不变。在解析操作中,它们必须与输入字符串中的字符完全匹配;比较区分大小写。”,如果
format
定义了一个没有时间元素的日期,并且解析操作成功,则生成的
DateTime
值的时间为午夜(00:00:00)。如果format定义的时间没有日期元素,并且解析操作成功,则生成的
DateTime
值的日期为
DateTime.Now.date
。因此,一个既没有时间元素也没有日期元素的字符串如果能够解析,将始终解析为
DateTime.Now.date
。@TimSchmelter:文档没有明确说明在自定义格式字符串既没有日期也没有时间成分的情况下会发生什么,但是缺少日期和时间的情况似乎是缺少日期或时间规则的逻辑扩展。@TimSchmelter:两个示例字符串都包含格式说明符。尝试使用它们调用
.ToString
。由此得出的结论是:您不能使用
日期时间。[尝试]ParseExact
验证格式字符串,否则您必须接受像
1019
这样的字符串是技术上有效的格式字符串(并让调用方接受)。谢谢问题是我无法控制传递到API的字符串,这在哪里记录?这显然不是有效的
DateTime
。为什么它被视为1并返回
DateTime.Today
任何传递的文本?为什么解析操作会成功?请参阅Jeroen的注释:。它不是有效的日期时间,但字符串确实符合解析规则。默认值现在刚刚生效@TimI Understand-因此,如果我的日期强为“9920180112”,格式字符串可以为“99yyyyMMdd”,例如,它将拒绝日期“9820180112”,则前面的“99”只是一个字符串文字match@TimSchmelter这是一个非常有效的
DateTime
。格式显示“为日期和时间的每个组件使用默认值”,并且为每个组件使用默认值的
DateTime
是有效的。这是一个无用的解析,但该规则允许我们处理固定的表示组件,如ISO8601格式的
T
,因此通用机制确实非常有用。