You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:21:11