C#如何过滤列表中非法日期格式并转换为指定yyyyMMdd格式
代码修改方案
现有代码的问题是直接使用DateTime.ParseExact进行解析,当遇到不符合指定格式的非法日期字符串时会抛出异常,无法实现过滤效果。我们可以通过DateTime.TryParseExact校验日期合法性,仅保留解析成功的结果。
优化后代码(推荐,仅单次解析性能更高)
using System.Globalization; public static List<string> TransformDateFormat(List<string> dates) { // 保留你原本定义的合法日期格式 var formats = new string[] { "yyyy/MM/dd", "dd/MM/yyyy", "MM-dd-yyyy", "dd.MM.yyyy" }; var result = new List<string>(); foreach (var dateStr in dates) { // 尝试解析日期,解析成功才添加到结果集 if (DateTime.TryParseExact(dateStr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { result.Add(parsedDate.ToString("yyyyMMdd")); } } return result; }
参数说明
CultureInfo.InvariantCulture:固定解析规则,不受运行环境的系统区域设置影响,确保你指定的4种日期格式能被正确识别。DateTimeStyles.None:严格匹配你定义的日期格式,不做额外的规则调整。
如果你偏好LINQ链式写法,也可以用如下实现,但会多一次解析操作,性能略低:
using System.Globalization; public static List<string> TransformDateFormat(List<string> dates) { var formats = new string[] { "yyyy/MM/dd", "dd/MM/yyyy", "MM-dd-yyyy", "dd.MM.yyyy" }; return dates .Where(date => DateTime.TryParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out _)) .Select(date => DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.None).ToString("yyyyMMdd")) .ToList(); }
内容的提问来源于stack exchange,提问作者App B
相关产品推荐
相关产品推荐

