使用DateTime.TryParseExact转字符串为DateTime时Birthday值未更新问题
问题分析与解决办法
核心问题排查
你的代码中DateTime.TryParseExact大概率未成功解析输入字符串,导致Birthday的赋值逻辑未执行,所以值始终没有变化。以下是具体原因和修复方案:
1. 格式匹配与样式设置的问题
你当前使用格式字符串"d"依赖en-US文化的短日期规则(即MM/dd/yyyy),但搭配DateTimeStyles.AdjustToUniversal可能引发隐性问题——输入的日期字符串不带时区信息,转换为UTC后可能与预期的本地日期逻辑冲突,甚至导致解析失败。更稳妥的方式是直接指定与输入完全匹配的格式字符串,避免依赖文化默认规则。
2. 修复后的Setter代码
将格式字符串改为明确的"MM/dd/yyyy",并移除不必要的DateTimeStyles.AdjustToUniversal(除非你确实需要将日期转换为UTC):
set { CultureInfo enUS = new CultureInfo("en-US"); if (DateTime.TryParseExact(value, "MM/dd/yyyy", enUS, DateTimeStyles.None, out DateTime parsedDate)) { this.Birthday = parsedDate; } }
3. 额外排查要点
- 确认传入的
value值:通过断点或日志验证,确保"01/12/2024"确实被传递到了setter中。 - 检查
Birthday的类型与状态:如果是DateTime?可空类型,确认没有其他代码覆盖其值;如果是DateTime值类型,初始值为DateTime.MinValue,需验证解析成功后赋值逻辑是否触发。 - 单独测试解析逻辑:在调试环境中执行
DateTime.TryParseExact("01/12/2024", "MM/dd/yyyy", new CultureInfo("en-US"), DateTimeStyles.None, out var date),确认返回true且date值符合预期。
完整修改后的代码示例
public string FormattedBirthday { get { return Birthday?.ToString("MM/dd/yyyy") ?? string.Empty; } set { CultureInfo enUS = new CultureInfo("en-US"); if (DateTime.TryParseExact(value, "MM/dd/yyyy", enUS, DateTimeStyles.None, out DateTime parsedDate)) { this.Birthday = parsedDate; } } }
内容的提问来源于stack exchange,提问作者Adresh Mishra
相关产品推荐
相关产品推荐

