2010-07-11 40 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");  
    }   
}