2011-04-18 68 views
8

下面的代碼如何格式化幾個小時而不是幾天時間跨度

Console.WriteLine("{0:%h} hours {0:%m} minutes", 
        new TimeSpan(TimeSpan.TicksPerDay)); 

產生這樣的輸出:

0小時0分鐘

我想是這樣的輸出:

24小時0分鐘

我在這種格式字符串中缺少什麼?

P.S.我知道我可以手動將TimeSpan解散爲幾天和幾小時,然後將兩者相乘,但寧願使用自定義格式字符串,因爲這些時間片正在Silverlight數據網格中顯示,人們期望看到荷爾斯,而不是幾天。

回答

13

MSDN,使用%h會告訴你

在時間間隔不作爲天的部分與整體的小時數。

我想你會需要使用TimeSpan類等的TotalHours屬性:

TimeSpan day= new TimeSpan(TimeSpan.TicksPerDay); 
Console.WriteLine("{0} hours {1} minutes", (int)day.TotalHours, day.Minutes); 

更新

如果你絕對需要能夠實現既定通過將自定義格式化程序傳遞給ToString方法,您可能需要創建自己的CustomTimeSpan分類秒。不幸的是,你不能繼承struct,所以你必須從頭開始構建它。

+0

Thanks for更新---這就是把我推向自定義類型的邊緣。 – 2011-04-18 14:26:48

+1

你可能不得不截斷它,否則totalhours屬性將不會顯示正確的數字。 昏暗X作爲新時間跨度(0,0,3600) 的String.Format( 「{0}小時:{1}分鐘」,CINT(Math.Truncate(x.TotalHours)),x.Minutes) – user1263981 2015-01-21 11:45:53

10

似乎沒有一個格式選項可以獲得TimeSpan的總小時數。您最好的選擇是使用TotalHours屬性來代替:

var mySpan = new TimeSpan(TimeSpan.TicksPerDay); 
Console.WriteLine("{0} hours {1} minutes", (int)mySpan.TotalHours, mySpan.Minutes); 

TotalHours返回一個double,因爲它包含小數個小時,所以你需要截斷它只是整數部分。

+0

正如我所說我知道我可以縮短時間跨度,但是我不認爲我可以用這種方法做的事情是使用傳遞給它的ToString方法的格式字符串來格式化時間跨度。 – 2011-04-18 14:09:03

+0

@Ralph - 是的,你正在「摧毀」'TimeSpan',但是不需要乘法運算。 – ChrisF 2011-04-18 14:10:04

+0

@ChrisF - 足夠真實,TotalHours比Days * 24 + Hours更容易,但難度依然存在。我需要一個格式字符串。 ---我猜這是不可能的。 – 2011-04-18 14:12:52

相關問題