2011-05-25 77 views
2

我在做一些簡單的計算,看看進程運行了多久。C#日期時間計算和ToString

(DateTime.Now - StrtTime).ToString("hh:mm:ss") 

其中StrtTime是:DateTime StrtTime = DateTime.Now; 。但我得到一個例外:

Input string was not in a correct format. 

這是什麼正確的方法呢?

+5

我相信你應該使用'Stopwatch' – V4Vendetta 2011-05-25 12:01:23

+0

(DateTime.Now - StrtTime)應爲返回的時間跨度,如果StrtTime是日期時間了。我擔心你提供了錯誤的代碼。 – 2011-05-25 12:05:17

+0

爲了避免日期時間算術,你見過'System.Diagnostics.Stopwatch'嗎?使用DateTime.Now相當昂貴並且可能不準確,因爲它需要OS的時區信息。如果您的運行發生在時鐘更改爲夏令時或從夏令時更改時會發生什麼情況?至少,請考慮使用'DateTime.UtcNow' – spender 2011-05-25 12:05:50

回答

9

一個DateTime減去另一個結果的值爲TimeSpan,而不是另一個DateTimeTimeSpan不支持您給定的格式字符串。

對於自定義格式的標準TimeSpan格式字符串,see herehere

但是,要測量處理時間,您應該使用而不是使用更適合任務的工具System.Diagnostics.Stopwatch

Stopwatch watch = new Stopwatch(); 
watch.Start(); 

DoSomeProcess(); 

watch.Stop(); 
TimeSpan processTime = watch.Elapsed; 
+0

好的,thnx。現在使用秒錶:String.Format(「{0:00}:{1:00}:{2:00}」,ts.Elapsed.Hours,ts.Elapsed.Minutes,ts.Elapsed.Seconds' where 'ts' is'Stopwatch ts = new Stopwatch();' – hs2d 2011-05-25 12:12:23

2

正如其他人所提到的,您可能想要使用StopWatch。但是,在您的特定情況下,您遇到錯誤,因爲您在使用格式化字符串TimeSpan.ToString時需要轉義「:」。試試這個:

(DateTime.Now - StrtTime).ToString(@"hh\:mm\:ss") 
+0

@Oskar Kjellin:這可能是一個更好的解決方案,但使用StopWatch卻出現錯誤,我只是解釋他爲什麼會得到這個錯誤。我給的是TimeSpan的支持,在downvoting之前自己試試吧 – 2011-05-25 12:14:23

+0

對不起,我沒有在msdn上看到自定義時間範圍格式部分:( – 2011-05-25 12:40:59

+0

@Oskar:Thanks :-) – 2011-05-25 12:45:46

0

使用秒錶類。

 Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     //code 

     sw.Stop(); 

     sw.Elapsed.ToString(); 
1

嘗試使用

Stopwatch stpWatch1 = new Stopwatch(); 
      stpWatch1.Start(); 
      ............. 
      stpWatch1.Stop(); 
TimeSpan ts = stpWatch1.Elapsed;// it also contains stpWatch1.ElapsedMilliseconds 
1

安東尼提到,秒錶會更適合完成這個任務。雖然要回答你的問題,你可以格式化日期是這樣的:

String.Format("{0:hh:mm:ss}", (DateTime.Now - StrtTime).ToString());