【发布时间】: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这样的字符串技术上是有效的格式字符串(并让调用者忍受)。