2011-05-25 106 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());