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 |
。
希望有帮助!
标准格式"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"); } } |