【问题标题】:2d 10:00:00 to TimeSpan in C#2d 10:00:00 到 C# 中的 TimeSpan
【发布时间】:2021-05-19 20:31:49
【问题描述】:

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

2d 10:00:00

到 C# 中的时间跨度? 已经有一些函数可以转换它?

其他一些例子可能是:

30d 00:00:00
1m 3d 20:00:01
1y 2d 00:00:00

甚至只是:

3d
10d
3m
3y 10d

【问题讨论】:

  • 使用一点乘法来求解总秒数并调用 TimeSpan.FromSeconds(double) ,这是 Msdn 页面:docs.microsoft.com/en-us/dotnet/api/…
  • @asawyer 几个月到几秒的转换是多少?
  • 没有明确的方法可以将年或月转换为 TimeSpan,除非您知道这些年或月是闰年以及并非所有月都有相同数量的事实天。
  • 如果您需要解析月份或年份字符串,您可以在Noda Time 中使用Period 类型而不是TimeSpan。您将使用 PeriodPattern 类进行解析。

标签: c# asp.net timespan


【解决方案1】:

TimeSpan 的解析能力非常有限,最多只能达到几天(而不是几个月或几年)。另一个复杂性是其中一些跨度是上下文相关的。从 2 月开始的 3m 跨度(有 28/29 和 30 天的月份)与从 7 月开始的 3m 跨度(有 2 个 31 天的月份)不同。

所以这取决于你想用跨度做什么来确定最好的解析方式。在某些时候,您必须用空格分割字符串并将NmNy 组件转换为天数,将解析的时间字符串组件(hh:mm:ss)添加到其中以生成总TimeSpan .

【讨论】:

  • 我明白了,所以将其限制在几天内会更可行吗?喜欢 30d 00:00:00 编辑:错字
  • @VitorSobrinho - 这是正确的。在不知道你正在处理哪个特定月份的情况下,不可能做几个月(我的意思不仅仅是“二月”,你也需要一年)。从月份开始,您的时间长度不再固定。
【解决方案2】:

天、小时、分钟和秒很容易,只要你有一个明确定义的输入格式:

string input = "2d 10:00:00";
Timespan parsedTimespan = TimeSpan.ParseExact(input, @"d\d\ hh\:mm\:ss", CultureInfo.InvariantCulture)

正如其他人所指出的,月份、年份等将是上下文相关的。从技术上讲,天也可以,但在这种情况下,“天”始终等于 24 小时,无论您的日历如何。

要支持其他格式,例如“2d”,您可能必须根据自己提出的规范编写自己的解析代码。如果这变得非常复杂,像 Sprache 这样的框架可以提供帮助。

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 2016-07-20
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多