2014-04-10 23 views
2

我一直在使用高精度的時間來記錄我的程序在控制檯中的事件。但很快我注意到該程序有時顯示時間四捨五入到毫秒,有時不顯示!它發生零星完全,這是相同的代碼,不會重新編譯,不能編輯運行之間:Mystery:DateTime的精度是四捨五入的,當它想要

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace DateTimePrecisionTest 
{ 
    class Program 
    { 
     static DateTime ProgramStartTimeGlobal; 

     static void PrintConsoleLogGlobal() 
     { 
      string TimeStampText = ((DateTime.Now - ProgramStartTimeGlobal).TotalMilliseconds/1000).ToString("0.000000"); 
      Console.WriteLine(String.Format("Global var: [ {0,10} ] ", TimeStampText)); 
     } 

     static void PrintConsoleLogLocal(DateTime StartTime) 
     { 
      string TimeStampText = ((DateTime.Now - StartTime).TotalMilliseconds/1000).ToString("0.000000"); 
      Console.WriteLine(String.Format("Local var: [ {0,10} ] ", TimeStampText)); 
     } 

     static void Main(string[] args) 
     { 
      ProgramStartTimeGlobal = DateTime.Now; 
      for (int i = 0; i < 20; i++) 
      { 
       PrintConsoleLogGlobal(); 
       PrintConsoleLogLocal(ProgramStartTimeGlobal); 
       Thread.Sleep(512); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

首先我想這取決於我是否打印全局或局部變量。但似乎並非如此。 輸出是(值括號是秒):發生在採用這種記錄其他節目

enter image description here enter image description here

這混亂精度的變化。這一方案,例如,在遠程服務器(它們之間具有不可預測的延遲)執行任務:

enter image description hereenter image description here

爲什麼?

+0

如果不除以1000,該怎麼辦?你也可以使用'Seconds'和'Milliseconds'部分。 –

+0

好的,刪除了'/ 1000'。它現在輸出如下:'[16348.435900]'(所以這是幾毫秒後的4位數字)。現在正在等待星星對齊以重現舍入。 – Taosique

回答

2

在內部,DateTime.Now(通過UtcNow)取決於Windows API GetSystemTimeAsFileTime。不幸的是,它會出現(請參見該頁面底部的社區評論),該時鐘的分辨率可能會因您系統上其他程序的活動而異。

timeBeginPeriod功能記錄爲:

此功能影響全球的Windows環境。 Windows使用任何進程請求的最低值(即最高分辨率)。

+0

哇,這太驚人了! – Taosique

+1

@Taosique - 好的,如果你想要任何精確的時間,你應該使用例如無論如何,['StopWatch'](http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx)。 –

+0

@Taosique - 並在[Now'的文檔中(http://msdn.microsoft.com/en-us/library/system.datetime.now(v = vs.110).aspx) :「該屬性的解析取決於系統計時器。」 –