You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将逗号分隔的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:06:02