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

出生日期输入格式化显示与合法性校验技术问询

出生日期格式化与合法性校验实现

需求明确

  • 输入:无分隔符数字字符串(如15022000,格式为DDMMYYYY)
  • 输出:格式化为DD-MM-YYYY样式(如15-02-2000)
  • 合法性校验规则:
    • 日期部分≤31
    • 月份部分≤12
    • 年份需满足2010 < 年份 < 2023

原代码(中文注释版)

private void AgeValueChanged(string s_value)
{
    // 清理输入:移除所有非数字字符,空值处理为空字符串
    string snum = System.Text.RegularExpressions.Regex.Replace(s_value, @"[^0-9]", string.Empty) ?? string.Empty;
    // 限制最大长度为8位(原逻辑注释为美国手机号规则,此处仅保留长度限制)
    if (snum.Length > 8) snum = snum.Substring(0, 8);

    // 按自定义规则格式化
    if (snum.Length < 2)
    {
        // 不做处理
    }
    else if(snum.Length == 2)
    {
        snum = $"{snum}";
    }
    else if (snum.Length <= 4)
    {
        snum = $"{snum.Substring(0, 2)} / {snum.Substring(2, snum.Length - 2)}";
    }
    else
    {
        snum = $"{snum.Substring(0, 2)} / {snum.Substring(2, 2)} / {snum.Substring(4, snum.Length - 4)}";
    }

    ageInputField.text = snum;

    // 如果文本长度变化,将光标移到末尾(可根据需求修改行为)
    if (snum.Length != s_value.Length)
    {
        ageInputField.ForceLabelUpdate();
        ageInputField.MoveTextEnd(false);
    }
}

原代码问题说明

原代码是针对手机号格式的处理逻辑,不符合当前需求的点包括:

  • 使用/作为分隔符,而非需求要求的-
  • 未实现任何日期合法性校验逻辑
  • 注释内容与出生日期处理场景不匹配

修改后的完整实现代码

private void AgeValueChanged(string s_value)
{
    // 清理输入:只保留数字,空值处理为空字符串
    string snum = System.Text.RegularExpressions.Regex.Replace(s_value, @"[^0-9]", string.Empty) ?? string.Empty;
    // 限制最大长度为8位(DDMMYYYY格式)
    if (snum.Length > 8) snum = snum.Substring(0, 8);

    // 按需求逐步格式化字符串
    string formattedDate = snum;
    if (snum.Length >= 2 && snum.Length < 4)
    {
        formattedDate = $"{snum.Substring(0, 2)}-{snum.Substring(2)}";
    }
    else if (snum.Length >= 4)
    {
        string dayPart = snum.Substring(0, 2);
        string monthPart = snum.Substring(2, 2);
        string yearPart = snum.Length > 4 ? snum.Substring(4) : string.Empty;
        
        // 拼接基础格式
        formattedDate = $"{dayPart}-{monthPart}";
        if (!string.IsNullOrEmpty(yearPart))
        {
            formattedDate = $"{formattedDate}-{yearPart}";
        }
    }

    ageInputField.text = formattedDate;

    // 输入过程中自动将光标移到末尾,保持流畅体验
    if (formattedDate.Length != s_value.Length)
    {
        ageInputField.ForceLabelUpdate();
        ageInputField.MoveTextEnd(false);
    }

    // 当输入完整8位时,执行合法性校验
    if (snum.Length == 8)
    {
        bool isValid = ValidateBirthDate(snum, out string errorMsg);
        // 可根据校验结果做UI提示,比如设置输入框颜色、显示错误文本
        // 示例:ageInputField.image.color = isValid ? Color.white : Color.red;
        // errorText.text = isValid ? string.Empty : errorMsg;
    }
}

/// <summary>
/// 校验出生日期合法性
/// </summary>
/// <param name="dateStr">8位无分隔符日期字符串(DDMMYYYY)</param>
/// <param name="errorMsg">错误信息</param>
/// <returns>是否合法</returns>
private bool ValidateBirthDate(string dateStr, out string errorMsg)
{
    errorMsg = string.Empty;
    
    // 拆分并转换日、月、年
    if (!int.TryParse(dateStr.Substring(0, 2), out int day)
        || !int.TryParse(dateStr.Substring(2, 2), out int month)
        || !int.TryParse(dateStr.Substring(4, 4), out int year))
    {
        errorMsg = "日期格式无效";
        return false;
    }

    // 校验月份范围
    if (month < 1 || month > 12)
    {
        errorMsg = "月份必须在1-12之间";
        return false;
    }

    // 校验日期范围
    if (day < 1 || day > 31)
    {
        errorMsg = "日期必须在1-31之间";
        return false;
    }

    // 校验年份范围
    if (year <= 2010 || year >= 2023)
    {
        errorMsg = $"年份必须在2011-2022之间";
        return false;
    }

    // 精确校验日期有效性(避免如2月30日这类不存在的日期)
    try
    {
        _ = new DateTime(year, month, day);
    }
    catch
    {
        errorMsg = "日期不存在(如2月30日)";
        return false;
    }

    return true;
}

代码说明

  1. 输入处理与格式化:实时清理非数字输入,按输入长度逐步添加-分隔符,匹配需求的显示格式
  2. 合法性校验:
    • 输入完整8位时自动触发校验
    • 分别校验日、月、年的范围,同时添加精确日期有效性校验
    • 输出错误信息,方便后续做UI提示
  3. 交互优化:输入过程中自动将光标移到末尾,保证流畅的输入体验

内容的提问来源于stack exchange,提问作者duc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:54:54