【问题标题】:DateTime.TryParseExact returns true if date string matches format string如果日期字符串与格式字符串匹配,则 DateTime.TryParseExact 返回 true
【发布时间】:2018-01-12 11:40:58
【问题描述】:

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

例如以下示例 - 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)

如果字符串不匹配 例如

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

这正确返回 false。

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

【问题讨论】:

  • 根据fine manual:“所有其他字符始终被解释为字符文字,并且在格式化操作中,未更改地包含在结果字符串中。在解析操作中,它们必须匹配中的字符准确输入字符串;比较区分大小写。"
  • Furthermore, "如果format 定义了一个没有时间元素的日期并且解析操作成功,则生成的DateTime 值的时间为午夜(00:00:00)。如果格式定义了一个没有日期元素的时间并且解析操作成功,生成的DateTime 值的日期为DateTime.Now.Date。"因此,一个既没有时间也没有日期元素的字符串将始终解析为DateTime.Now.Date,如果它完全解析的话。
  • @TimSchmelter:文档没有明确说明在没有日期和时间组件的自定义格式字符串的情况下会发生什么,但在缺少日期 和 时间的情况下会发生什么似乎是缺少日期或时间的规则的逻辑扩展。
  • @TimSchmelter:您的两个示例字符串都包含格式说明符。尝试与他们联系.ToString。
  • 所有这些的结论:你不能使用DateTime.[Try]ParseExact来验证格式字符串,否则你必须接受像1019这样的字符串技术上是有效的格式字符串(并让调用者忍受)。

标签: c# datetime


【解决方案1】:

这是预期的行为吗?

是的。

如果可以,谁能解释一下内部工作原理?

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

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

使用实际的日期时间格式字符串,例如HHmm。

【讨论】:

  • 谢谢! - 问题是我不控制传递到 api 的字符串
  • 这是在哪里记录的?这显然不是有效的DateTime。为什么它被视为一个并为任何传递的文字返回DateTime.Today?为什么解析操作完全成功?
  • 查看 Jeroen 的评论:stackoverflow.com/questions/48225571/…。它不是有效的日期时间,但字符串确实符合解析规则。默认值现在才开始。 @蒂姆
  • 我知道 - 所以如果我的日期强是“9920180112”并且我的格式字符串可能是“99yyyyMMdd”,例如这将拒绝日期“9820180112”,前面的“99”只是一个字符串字面匹配
  • @TimSchmelter 这是一个完全有效的DateTime。该格式表示“为日期和时间的每个组件使用默认值”,并且每个组件的默认值 DateTime 是有效的。这是一个无用解析,但该规则允许我们处理固定表示的组件,例如 ISO 8601 格式的T,因此通用机制确实非常有用。
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多