2d 10:00:00 到 C# 中的 TimeSpan

问题描述

有可能以某种方式转换如下内容

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 天的月份)。

因此,这取决于您想对跨度做什么来确定最佳的解析方式。在某些时候,您必须用空格分割字符串并将 NmNy 组件转换为天数,将解析的时间字符串组件 (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 这样的框架会有所帮助。