如何将逗号分隔的d、h、m、s、f格式字符串解析为C# TimeSpan类型
解决方案
方案1:修正TryParseExact写法(符合直接基于原格式解析的需求)
你之前的解析失败是三个原因导致的:
- 格式字符串中的逗号、空格属于字面匹配内容,需要转义或者用引号包裹,否则会被识别为格式说明符
- 输入的各时间部分是单数字时,用双字符格式符(比如
dd/hh)要求必须输入两位补零的数值,会直接匹配失败 - 未指定固定区域格式,可能受系统本地区域设置影响解析
正确写法如下:
using System.Globalization; TimeSpan ts; // 格式字符串里的字面分隔符用单引号包裹,单字符格式符匹配任意位数的对应时间部分,指定不变区域避免区域差异 bool parseSuccess = TimeSpan.TryParseExact("1, 2, 3, 4, 5", @"d'\, 'h'\, 'm'\, 's'\, 'f", CultureInfo.InvariantCulture, out ts);
如果你的输入里毫秒可能出现两位的情况,把最后的f改成ff即可,也可以用%f来匹配1-2位的毫秒值。
方案2:优化字符串拆分实现(鲁棒性更高)
你之前给出的拆分写法存在逻辑错误:直接取data[0]拿到的是字符串的第一个字符,不是拆分后的第一个数值。优化后的鲁棒写法如下,兼容格式异常的降级处理,更适合配置项读取场景:
var configStr = ApplicationConfiguration.Instance .GetAppConfigValue("SavingRewardConfigurationCachingPeriod") ?? "0, 0, 0, 5, 0"; // 拆分+转换+容错处理 var timeParts = configStr.Split(',') .Select(p => int.TryParse(p.Trim(), out int val) ? val : 0) .Take(5) .ToArray(); // 补全不足5位的情况,避免构造函数报错 while (timeParts.Length < 5) { timeParts = timeParts.Append(0).ToArray(); } TimeSpan ts = new TimeSpan(timeParts[0], timeParts[1], timeParts[2], timeParts[3], timeParts[4]);
内容的提问来源于stack exchange,提问作者dmytro.kozyr
相关产品推荐
相关产品推荐

