首页 > 解决方案 > C# 如何将时间 [ms, s, m, h, d] 作为字符串转换为秒作为 int

问题描述

我想知道是否有一种快速方法(可能使用 TimeSpan)将持续时间格式的字符串(如17.24sor20.79m或)转换1.3h为秒格式(如17for 17.24s1260for20.79m4699for )1.3h

感谢您的建议。

标签: c#timespan

解决方案


让我们从数学开始:

  20.79 minutes == 20.79 * 60 seconds == 1247 seconds
    1.3 hours   == 1.3 * 3600 seconds == 4680 seconds

我看不到1260or 4699,这就是为什么我会坚持简单的数学,\\TODO:如果你坚持不同的逻辑,我会用应该修改的代码来标记。

对于不同的后缀,让我们提取模型:

private static Dictionary<string, Func<double, TimeSpan>> s_Builders =
  new Dictionary<string, Func<double, TimeSpan>>(StringComparer.OrdinalIgnoreCase) {
    
    {  "", x => TimeSpan.FromSeconds(x)},
    { "s", x => TimeSpan.FromSeconds(x)},
    //TODO: if you insist on 1260, put required logic here
    { "m", x => TimeSpan.FromMinutes(x)},
    //TODO: if you insist on 4699, put required logic here
    { "h", x => TimeSpan.FromHours(x)},
    { "d", x => TimeSpan.FromDays(x)},
}; 

时间实现TryMyParse方法:

public static bool TryMyParse(string value, out TimeSpan result) {
  result = default;

  if (string.IsNullOrWhiteSpace(value))
    return false;

  string suffix = s_Builders
    .Keys
    .OrderByDescending(key => key.Length)
    .FirstOrDefault(key => value.EndsWith(key, StringComparison.OrdinalIgnoreCase));

  if (null == suffix)
    return false;
  else if (double.TryParse(value.Substring(0, value.Length - suffix.Length), 
                           out double number)) {
    try {
      result = s_Builders[suffix](number);

      return true;
    }
    catch (OverflowException) {
      return false;
    }
    catch (ArgumentException) {
      return false;
    }
  }

  return false;
}

最后,MyParse很简单:

public static TimeSpan MyParse(string value) =>
  TryMyParse(value, out var result)
    ? result
    : throw new FormatException($"{value} is not a valid time");

演示:

  string[] tests = new string[] {
    "17.24s",
    "20.79m", 
    "1.3h",
  };

  string demo = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,6} :: {Math.Round(MyParse(test).TotalSeconds),4}"));

  Console.Write(demo);

结果:

  17.24s ::   17
  20.79m :: 1247
    1.3h :: 4680

推荐阅读