C#使用Convert.ToDateTime将日期转为dd-MMM-yyyy格式用于Excel导出
解决方案
你的问题核心是:Convert.ToDateTime仅负责将字符串转换为无格式的DateTime类型对象,日期的显示格式是在调用ToString()方法时指定的,你之前直接用默认ToString()后截取前10位,自然只能得到系统默认格式的日期。
核心修正点
将原有日期转换部分的代码替换为以下逻辑,直接在ToString时传入目标格式dd-MMM-yyyy,同时指定固定区域信息保证月份为标准英文缩写:
// 请先引入命名空间 using System.Globalization; if (audit.FromDate != null) { dt1 = Convert.ToDateTime(audit.FromDate); // 指定输出格式和固定区域,避免系统语言影响月份缩写 StartDate = dt1.Value.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture); } if (audit.ToDate != null) { dt2 = Convert.ToDateTime(audit.ToDate); EndDate = dt2.Value.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture); }
兼容任意输入日期格式的更稳妥方案
如果输入的日期字符串格式不固定,建议用TryParseExact预先配置所有可能的输入格式,避免转换失败抛出异常:
// 预先定义所有可能出现的输入日期格式,可按需扩展 string[] inputFormats = new[] { "yyyy-MM-dd", "MM/dd/yyyy", "dd/MM/yyyy", "yyyy/MM/dd", "MM-dd-yyyy", "dd-MM-yyyy" }; foreach (var audit in collection) { string StartDate = null, EndDate = null; // 处理开始日期 if (!string.IsNullOrWhiteSpace(audit.FromDate?.ToString())) { if (DateTime.TryParseExact(audit.FromDate.ToString(), inputFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime fromDate)) { StartDate = fromDate.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture); } } // 处理结束日期 if (!string.IsNullOrWhiteSpace(audit.ToDate?.ToString())) { if (DateTime.TryParseExact(audit.ToDate.ToString(), inputFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime toDate)) { EndDate = toDate.ToString("dd-MMM-yyyy", CultureInfo.InvariantCulture); } } // 后续插入obj的逻辑保持不变 }
注意事项
- 必须引入
System.Globalization命名空间才能使用CultureInfo类 - 保留
CultureInfo.InvariantCulture可保证月份固定为英文缩写(Jan、Feb等),如果需要其他语言的月份缩写可替换为对应区域信息 - 推荐使用第二种稳妥方案,可避免异常输入导致的程序崩溃
内容的提问来源于stack exchange,提问作者Konda Reddy
相关产品推荐
相关产品推荐

