You need to enable JavaScript to run this app. 如何修改C# Excel转SQL日期方法 自动识别格式输出yyyy-MM-dd
优惠活动
大模型
产品
解决方案
定价
更多

如何修改C# Excel转SQL日期方法 自动识别格式输出yyyy-MM-dd

需求说明

我实现了一个名为convertDatefromExcelToSQL的方法,功能是提取Excel文件中的日期值并转换为标准格式yyyy-MM-dd。但该方法存在兼容问题:当运行设备的系统日期格式与方法内预设的格式不一致时,会触发转换报错。需要对该方法进行改造,使其可以自动识别输入的日期格式,最终仍然输出标准的yyyy-MM-dd格式日期。

原有实现代码

核心转换方法

public static string convertDatefromExcelToSQL(string excelDate)
{
    string sdat = "";
    DateTime dat;
    sdat = ((string.IsNullOrEmpty(excelDate)) ? sdat : excelDate);
    if (MIB.IsDouble(sdat))
    {
        dat = DateTime.FromOADate(double.Parse(sdat));
    }
    else
    {
        if (sdat.Contains(":"))
        {
            sdat = sdat.Split(' ')[0];
        }
        dat = DateTime.ParseExact(sdat, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    }
    return dat.ToString("yyyy-MM-dd");
}

依赖的IsDouble方法

public static bool IsDouble(string text)
{
    Double num = 0;
    bool isDouble = false;

    // 空字符串直接返回false
    if (string.IsNullOrEmpty(text))
    {
        return false;
    }

    isDouble = Double.TryParse(text, out num);

    return isDouble;
}
改造后兼容多格式的实现
public static string convertDatefromExcelToSQL(string excelDate)
{
    // 空输入直接返回空字符串,可根据业务需要调整为其他默认值
    if (string.IsNullOrEmpty(excelDate))
    {
        return "";
    }

    string sdat = excelDate.Trim();
    DateTime dat;

    // 处理Excel数字格式日期
    if (IsDouble(sdat))
    {
        dat = DateTime.FromOADate(double.Parse(sdat));
        return dat.ToString("yyyy-MM-dd");
    }

    // 去除时间部分,只保留日期段
    if (sdat.Contains(":"))
    {
        sdat = sdat.Split(' ')[0];
    }

    // 预设所有可能的日期格式,可根据实际业务场景扩展
    string[] allowedFormats = new string[]
    {
        "dd/MM/yyyy", "MM/dd/yyyy", "yyyy/MM/dd",
        "dd-MM-yyyy", "MM-dd-yyyy", "yyyy-MM-dd",
        "dd.MM.yyyy", "MM.dd.yyyy", "yyyy.MM.dd"
    };

    // 多格式匹配
    if (DateTime.TryParseExact(sdat, allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat))
    {
        return dat.ToString("yyyy-MM-dd");
    }

    // 兜底匹配:如果上面的格式都不匹配,尝试用系统默认格式解析
    if (DateTime.TryParse(sdat, out dat))
    {
        return dat.ToString("yyyy-MM-dd");
    }

    // 所有解析都失败的兜底返回,可根据业务需要调整,比如返回原字符串、空字符串或抛出业务异常
    return "";
}
改造说明
  • 新增了常用日期格式列表,覆盖了不同地区常用的斜杠、横杠、点分隔的日期书写格式,可根据实际业务场景随时增删列表内的格式
  • 将原有的强制单格式匹配ParseExact替换为多格式匹配的TryParseExact,不会因为格式不匹配直接抛出异常
  • 增加了双重兜底逻辑:先尝试用预设格式匹配,匹配失败再调用通用TryParse适配系统格式,最大程度提升兼容能力
  • 优化了空值处理逻辑,避免空值引发的报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:36:03