问题描述
有可能以某种方式转换如下内容:
2d 10:00:00
在 c# 中使用 TimeSpan? 已经有一些函数可以转换它?
其他一些示例可能是:
30d 00:00:00
1m 3d 20:00:01
1y 2d 00:00:00
甚至只是:
3d
10d
3m
3y 10d
解决方法
TimeSpan
的解析能力非常有限,最多只能达到几天(不是几个月或几年)。另一个复杂性是其中一些跨度是依赖于上下文的。从 2 月开始的 3m
跨度(有 28/29 和 30 天的月份)不同于从 7 月开始的 3m
跨度(有 2 个 31 天的月份)。
因此,这取决于您想对跨度做什么来确定最佳的解析方式。在某些时候,您必须用空格分割字符串并将 Nm
和 Ny
组件转换为天数,将解析的时间字符串组件 (hh:mm:ss
) 添加到生成总计 TimeSpan
。
天、小时、分钟和秒很容易,只要您有明确定义的输入格式:
string input = "2d 10:00:00";
Timespan parsedTimespan = TimeSpan.ParseExact(input,@"d\d\ hh\:mm\:ss",CultureInfo.InvariantCulture)
正如其他人指出的那样,月份、年份等将是上下文相关的。从技术上讲,天也可以,但在这种情况下,“天”始终等于 24 小时,无论您的日历如何。
要支持其他格式,例如“2d”,您可能必须根据您提出的规范编写自己的解析代码。如果这变得非常复杂,像 Sprache 这样的框架会有所帮助。