c# - C# 如何将时间 [ms, s, m, h, d] 作为字符串转换为秒作为 int
问题描述
我想知道是否有一种快速方法(可能使用 TimeSpan)将持续时间格式的字符串(如17.24s
or20.79m
或)转换1.3h
为秒格式(如17
for 17.24s
、1260
for20.79m
和4699
for )1.3h
。
感谢您的建议。
解决方案
让我们从数学开始:
20.79 minutes == 20.79 * 60 seconds == 1247 seconds
1.3 hours == 1.3 * 3600 seconds == 4680 seconds
我看不到1260
or 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
推荐阅读
- django - Django - 表单上的删除按钮未重定向到正确的路径
- c# - 带有 Include 和 Where 的 LINQ 未显示所需结果
- c - 用逗号分割不能按预期工作
- python-3.x - 为什么说这两个值不一样?
- swift - Snapkit centerY 约束将项目居中于中心 Y 轴上方
- powershell - 尝试将具有特定日期的文件从文件夹复制到具有镜像文件夹结构的另一个位置
- c# - 派生类中可以使用虚方法
- json - 对集合资源的响应负载正文的建议
- laravel - 将 Laravel Echo 与 docker 一起使用(CORS 问题)
- java - 使用 JSONObject 显式声明可空字段的类型