如何在C#中解析带空格的畸形日期(如“ 1 21998”代表1998年2月1日)
不规范日期解析解决思路
失败原因
你之前尝试的代码无法解析的核心问题是:单字符d和M属于可变长度格式符,解析时会尽可能向后匹配更多数字,导致月份会误取到年份的第一位数字,最终因月份非法解析失败。
你遇到的日期本质是固定8位长度的结构:前2位为日(不足2位时用空格补位)、中间2位为月(不足2位时用空格补位)、最后4位为年。
方案1:空格转0(最简单通用)
直接把输入字符串中的所有空格替换为0,即可转为标准的ddMMyyyy格式,直接解析即可:
DateTime date; string input = " 1 21998"; // 所有空格替换为0,得到标准格式字符串"01021998" string processedInput = input.Replace(" ", "0"); if (DateTime.TryParseExact(processedInput, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out date)) { Console.WriteLine(date.ToString("yyyy年MM月dd日")); // 输出结果:1998年02月01日 }
方案2:固定长度拆分(兼容异常空格场景)
如果部分输入存在空格位置不规律的情况,可以按固定长度拆分各日期部分,处理后再拼接解析,稳定性更高:
DateTime date; string input = " 1 21998"; // 先校验输入长度符合8位规则 if (input.Length == 8) { // 拆分日、月、年三部分,去掉空格后补0对齐2位 string day = input.Substring(0, 2).Trim().PadLeft(2, '0'); string month = input.Substring(2, 2).Trim().PadLeft(2, '0'); string year = input.Substring(4, 4); string processedInput = $"{day}{month}{year}"; if (DateTime.TryParseExact(processedInput, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out date)) { Console.WriteLine(date.ToString("yyyy年MM月dd日")); } }
内容的提问来源于stack exchange,提问作者M. Bauer
相关产品推荐
相关产品推荐

