格式化负TimeSpan

时间:2010-07-11 17:02:52

标签: .net vb.net formatting timespan

我正在使用.Net中的Timespans进行一些数学运算,偶尔总结会产生负时间跨度。当我显示结果时,我无法格式化它以包含否定指示符。

Dim ts as New Timespan(-10,0,0)

ts.ToString()

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

ts.ToString("hh\:mm")

返回“10:00”并从前面删除了“ - ”,这是问题的症结所在。我目前的解决方案是:

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

但我希望通过仅使用格式字符串来实现相同目的。

7 个答案:

答案 0 :(得分:14)

我在TimeSpan.ToString(...)上使用了.Net Reflector,看起来它看起来不像自定义格式支持任何形式的负前缀 - 所以我觉得你运气不好如上所述让它为你工作。 :(

答案 1 :(得分:8)

好像你已经坚持使用该代码,但如果是这样,这似乎是编写extesion方法的好时机,这样你就可以使你的代码更清晰,而且你不必在多个代码中重复这些代码地方,所以像:

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

然后你可以把它称为:

ts.HoursAndMinutes()

答案 2 :(得分:2)

我同意威尔。 MSDN和Reflector都表明你运气不好。你要做的最好的事情就是使用你拥有的东西,编写自己的IFormatProvider,或者使用其中一种标准格式作为“g”的时间跨度。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我正在使用这个很难看的代码:

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);
           }

希望它有所帮助!

答案 5 :(得分:0)

根据@ ho1的答案,我建立了一个扩展方法。现在可能会更容易使用。

public static class TimeSpanUtil
{
    public static string HoursAndMinutes(this TimeSpan ts) 
    {
        return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");     
    }        
}

答案 6 :(得分:0)

在测试了不同的方法之后,我做了以下事情:

Public Module TimeExtensions
    <Extension>
    Public Function ToHourMinute(ByVal time As TimeSpan) As String
        Return $"{If(time < TimeSpan.Zero, "-", "")}{time:hh\:mm}"
    End Function
End Module