2010-07-11 43 views
23

我正在与.Net中的Timespans进行一些数学计算,偶尔总和会导致负的Timespan。当我显示结果时,我无法格式化它以包含负面指标。格式化否定时间跨度

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") 

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

+0

所以很奇怪。 MSDN建议通过'c'格式支持,但如果以自定义格式使用它,它会使http://msdn.microsoft.com/en-us/library/ee372286(v=vs.100)崩溃。 aspx – 2015-01-13 19:43:43

回答

11

我在TimeSpan.ToString(...)上使用了.Net反射器,它看起来不像它支持任何形式的自定义格式的负面前缀 - 所以我认为你运气不好就像上面那样让它为你工作。 :(

2

我同意Will MSDN和Reflector都表示你运气不好,你得到的最好的结果是使用你所拥有的,编写你自己的IFormatProvider或者使用其中一个标准像“g”这样的时间段格式。

8

看起来好像你被这段代码困住了,但是如果是这样的话,这看起来像是写一个extesion方法的好时机,这样你可以使你的代码更清晰, “T不得不重复在多个地方的代码,所以像:

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() 
+0

这可以被认为是具有特定格式的扩展方法的滥用。 – mattmc3 2010-07-11 18:10:51

+0

@ mattmc3:好吧,我可能不会像这样写一个,而是放在一个通用库中,但为了使一个特定的项目更具可读性,我不会担心这一点。 – 2010-07-11 18:17:00

+0

我最终实现了这个作为扩展方法,所以谢谢。给威尔的答案是,他是第一个确认无法单独使用格式字符串的人。可能滥用马特,但几乎在这个应用程序中的每个文本框需要这样格式化,所以我认为在这种情况下它确定。 – 2010-07-12 18:48:43

1

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

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

我使用这个代码的fugly:

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

希望它能帮助!

0

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

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