处理负时间跨度

33 .net c# datetime timespan

在我的网格输出中,我计算a TimeSpan并采用它TotalHours.例如

(Eval("WorkedHours") - Eval("BadgedHours")).TotalHours
Run Code Online (Sandbox Code Playgroud)

目标是显示TotalHoursas 39:44,所以我需要将值转换7.507:30.这没问题......除非它是否定的!

我可以创建一个TimeSpan从对象Hours

TimeSpan.FromHours( (Eval("WorkedHours") - Eval("BadgedHours")).TotalHours)
Run Code Online (Sandbox Code Playgroud)

如果它是否定的,我无法将其转换DateTime为使用该.ToString("HH:mm")方法,并且该TimeSpan对象不支持格式字符串.

Jar*_*red 80

有没有TimeSpan.Duration方法?我认为这会处理你想要做的事情.

  • 这是最简单的方法,只需减去两个DateTime,在结果上调用Duration(),然后执行TotalHours. (4认同)

SLa*_*aks 10

static string ToHMString(TimeSpan timespan) { 
    if (timespan.Ticks < 0) return "-" + ToHMString(timespan.Negate());

    return timespan.TotalHours.ToString("#0") + ":" + timespan.Minutes.ToString("00");
}

Console.WriteLine(ToHMString(TimeSpan.FromHours(3)));       //Prints "3:00"
Console.WriteLine(ToHMString(TimeSpan.FromHours(-27.75)));  //Prints "-28:45"
Run Code Online (Sandbox Code Playgroud)

如果时间跨度超过24小时,这也将正常工作.


Dan*_*ite 8

只需将其乘以-1或使用绝对值函数即可.

  • 对于任何使用Google搜索的人:使用`TimeSpan.Duration`方法.从MSDN:"返回一个新的TimeSpan对象,其值是当前TimeSpan对象的绝对值". (46认同)

Eug*_*ica 5

TimeSpan类中有一个Negate方法。

链接到MSDN文档: TimeSpan.Negate Method()