关于.net:格式化负TimeSpan

Formatting a negative TimeSpan

我正在用.NET中的时间跨度做一些数学计算,有时求和会导致负的时间跨度。当我显示结果时,很难将其格式化为包含负指示器。

1
2
3
Dim ts as New Timespan(-10,0,0)

ts.ToString()

这将显示"-10:00:00",这很好,但我不想显示秒数,所以尝试了这个。

1
ts.ToString("hh\:mm")

这将返回"10:00",并将"—"从前面删除,这是问题的关键所在。我目前的解决方案是:

1
If(ts < TimeSpan.Zero,"-","") & ts.ToString("hh\:mm")

但我希望通过只使用格式字符串来实现这一点。


我在TimeSpan.ToString(…)上使用了.NET Reflector,它看起来不支持任何形式的自定义格式的负前缀-所以我认为你不太走运,因为要让它像上面那样为你工作。:(


似乎你被代码困住了,但如果是这样的话,现在似乎是编写一个extesion方法的好时机,这样你就可以让代码更清晰,而且你不必在多个地方重复代码,所以类似于:

1
2
3
4
5
6
Module Extensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function HoursAndMinutes(ByVal ts As TimeSpan) As String
        Return If(ts < TimeSpan.Zero,"-","") & ts.ToString("hh\:mm")
    End Function
End Module

然后你可以称之为:

1
ts.HoursAndMinutes()


我同意威尔的意见。msdn和reflector都表示你运气不好。你能得到的最好的方法是要么使用你拥有的,要么编写你自己的iformatProvider,要么使用一种标准的时间跨度格式,比如"g"。


我在用这个暗号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (timeDiff.TotalSeconds < 0)
           {
               timeDiff = timeDiff.Negate();
               TimeChangeTb.Text = string.Format("-{0:D2}:{1:D2}:{2:D2}",
               timeDiff.Hours,
               timeDiff.Minutes,
               timeDiff.Seconds);
           }
           else
           {
               TimeChangeTb.Text = string.Format("{0:D2}:{1:D2}:{2:D2}",
               timeDiff.Hours,
               timeDiff.Minutes,
               timeDiff.Seconds);
           }

希望有帮助!


标准格式"C"提供负号,但包括时间跨度的所有部分。

1
2
    Dim ts As New TimeSpan(-10, 1, 2)
    Debug.WriteLine(ts.ToString("c"))

基于@ho1答案,我构建了一个扩展方法。现在可能更容易使用。

1
2
3
4
5
6
7
public static class TimeSpanUtil
{
    public static string HoursAndMinutes(this TimeSpan ts)
    {
        return (ts < TimeSpan.Zero ?"-" :"") + ts.ToString("hh:mm");    
    }        
}