2010-08-23 21 views
13

我想在字符串中顯示兩個日期之間的耗用時間。使用TimeSpan上的String.Format輸出完整秒數而不輸入毫秒

比方說,我有以下代碼:

DateTime date1 = DateTime.Now(); 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now(); 

TimeSpan elapsed = date2.substract(date1); 
Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

我期待什麼:

> 00:00:03 

我能得到什麼:

> 00:00:02.5002500 

有沒有使用String的方式。格式化功能只返回完整的秒數?
我也試圖與刪除小數位:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds); 

但是,這並不工作,要麼因爲elapsed.Miliseconds返回500作爲一個整數。

回答

18

更改

Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed); 

.NET 4中,您可以使用自定義格式字符串與時間跨度。您可以在MSDN Custom TimeSpan Format Strings頁面找到可用格式說明符的完整參考。

您需要使用「\」(除非使用逐字字符串本身必須轉義)轉義「:」字符。

這段摘自MSDN Custom TimeSpan Format Strings頁面的內容解釋瞭如何轉義「:」和「。」。格式字符串中的字符:

自定義TimeSpan格式說明符不包括佔位符分隔符,例如將小時與小時,小時與分鐘或小數秒分隔的符號。相反,這些符號必須作爲字符串文字包含在自定義格式字符串中。例如,「dd.hh:mm」將句點(。)定義爲日期和小時之間的分隔符,並將冒號(:)作爲小時和分鐘之間的分隔符。

2

看過幾個這樣做的方法後,我不幸留下了一個醜陋的答案。你真的不能使用蜱,因爲它不正確地返回的格式,但下面的工作:Y(年),M(月),d(天

DateTime date1 = DateTime.Now; 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now; 

TimeSpan elapsed = date2.Subtract(date1); 

string[] Split = elapsed.ToString().Split('.'); 

string m = Split[0]; // Returns 00:00:02 
+0

一個很好的解決方案,太(可能是最有效的有關業績)。 – 2010-08-23 10:41:48

+0

可能只是用0秒的片段創建了一個新的TimeSpan,然後打印出一個。 「g」格式與CultureInfo.InvariantCulture一起應該可以正常工作 – 2016-05-15 21:33:50

-6

有以下自定義格式說明),h(小時12),H(小時24),m(分鐘),s(秒),f(第二部分),F(第二部分,尾部零點被修整),t(PM或AM)時區)。

以下示例演示了格式說明符如何重寫爲輸出。 [C#]

// create date time 2008-03-09 16:05:07.123  
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);  
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year  
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month  
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day  
String.Format("{0:h hh H HH}",  dt); // "4 04 16 16"  hour 12/24 
String.Format("{0:m mm}",   dt); // "5 05"   minute 
String.Format("{0:s ss}",   dt); // "7 07"   second  
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction  
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes  
String.Format("{0:t tt}",   dt); // "P PM"   A.M. or P.M.  
String.Format("{0:z zz zzz}",  dt); // "-6 -06 -06:00" time zone 
+2

OP正在尋求格式化* TimeSpan *,而不是* DateTime *。 – 2010-08-23 07:44:58

13

不幸的是它不可能以同樣的方式爲DateTime值格式化TimeSpan。但是,您可以進行快速轉換,因爲TimeSpan和DateTime都將其值存儲爲標記(在Ticks屬性中)。

在你的代碼應該是這樣的:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

UPDATE:這適用於.NET 3.5和更早的版本,.NET 4不支持格式的時間跨度。

+0

我相信你想'HH:mm:ss'這是正確的。整潔的把戲,但我+1, – fearofawhackplanet 2010-08-23 07:46:42

+0

偉大的解決方案(因爲我的Timespan永遠不會超過24小時),而fearofawhackplanet是正確的:'HH:mm:ss'更有意義。 – 2010-08-23 10:40:00

+2

在.Net 4中,您確實可以使用與DateTime相同的方式格式化Timespan。您可以使用以下內容:{0:hh \\:mm \\:ss}。有關更多詳情,請參閱下面的答案。 – 2010-12-08 14:02:17

1

嗯,這是討厭的(因爲它原來) - 至少前.NET 4.0

如果你去這裏:http://msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx它會告訴你,有一個時間跨度無格式超載和你有手如要做到這一點:

 span.Hours.ToString("00") + ":" + 
    span.Minutes.ToString("00") + ":" + 
    span.Seconds.ToString("00") + "." 

這似乎 - 至少是從文件 - 被固定在.NET 4.0中

4

TimeSpan類有HoursMinutesSeconds個屬性,每個時間段分別返回。所以你可以嘗試:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds) 

得到你想要的格式。

可能有更優化的方法,但我還沒有找到它。

-2

,你可以這樣做:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString(); 
+2

請添加一些解釋! – 2014-06-12 21:41:15

+0

這也可以,但是由於Framework 4 .NET本身支持時間間隔格式化,這是最好的解決方案。 – 2014-06-13 05:53:42