C#使用DateTime.TryParseExact验证字符串日期返回结果错误
问题根因
验证逻辑返回结果不符合预期,由两处代码错误导致:
- 日期格式占位符书写错误:
DateTime.TryParseExact的自定义日期格式规则中,四位公历年的占位符为小写yyyy,代码中写的大写YYYY是ISO周历的年份占位符,和公历日期的匹配规则不一致,会直接造成解析失败。 - 解析结果未绑定到返回对象:代码中虽然通过
TryParseExact得到了isDateValid验证结果,但从未将该结果赋值给初始化的validationStatus对象,方法始终返回默认初始化的状态,自然无法得到正确的验证结论。
修复方案
修正格式字符串,同时将解析结果写入返回的验证状态对象即可,修复后的代码如下:
public override ValidationStatus Validate(string Text) { ValidationStatus validationStatus = new ValidationStatus(); if (string.IsNullOrEmpty(Text)) { validationStatus.IsValid = false; return validationStatus; } int[] index = { 1, 3 }; var date = StringExtensions.MultiInsert(Text, "/", index); DateTime tempDate; // 修正格式字符串:使用小写yyyy表示四位公历年 var isDateValid = DateTime.TryParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out tempDate); // 将验证结果赋值给返回对象 validationStatus.IsValid = isDateValid; return validationStatus; }
额外优化建议
不需要先调用MultiInsert插入分隔符再做解析,TryParseExact支持直接匹配无分隔符的原始日期串,省去字符串拼接操作的同时,还能避免插入位置写错带来的异常,直接对原始输入做解析即可:
// 直接解析DDMMYYYY格式的原始输入,无需提前插入斜杠 var isDateValid = DateTime.TryParseExact(Text, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out tempDate);
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

