DateTime的默认时间精度是多少?

Sea*_*Jay 4 c# precision datetime

我在Visual Studio中为数据传输做了一个小的winform程序,我使用了一种方法来提供传输持续时间.传输完成后,程序将返回一个对话窗口以显示时间.

但是在这里我不知道时间精度或定时器的分辨率是多少,它怎么能是如此精确,甚至是微秒?

var startTime = DateTime.Now;
this.transferdata();
var endTime = DateTime.Now;
var timeElapsed = endTime.Subtract(startTime);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我看到类DateTime的定义时,只有精度以毫秒为单位.任何人都可以告诉我为什么在visual studio 2012中有这么高分辨率的计时器?还是与操作系统有关?

Guf*_*ffa 6

时钟的精度取决于操作系统.系统时钟每秒记录一定次数,您只能测量整个刻度.

您可以使用以下代码测试特定计算机的分辨率:

DateTime t1 = DateTime.Now;
DateTime t2;
while ((t2 = DateTime.Now) == t1) ;
Console.WriteLine(t2 - t1);
Run Code Online (Sandbox Code Playgroud)

在我的计算机上,结果是00:00:00.0156253,这意味着系统时钟每秒滴答64次.

(注意:该DateTime类型也有刻度,但这与系统时钟刻度不同.DateTime刻度是1/10000000秒.)

要更精确地测量时间,您应该使用Stopwatch该类.它的分辨率还取决于系统,但远高于系统时钟.你可以从分辨率Stopwatch.Frequency属性,我的电脑上,它返回2143566它是一点点更超过64 ...

在工作之前启动秒表并在之后停止,然后获取经过的时间:

Stopwatch time = Stopwatch.StartNew();
this.transferdata();
time.Stop();
TimeSpan timeElapsed = time.Elapsed;
Run Code Online (Sandbox Code Playgroud)

这将返回TimeSpan类型可以处理的分辨率的时间,例如1/10000000秒.您还可以根据刻度数计算时间:

double timeElapsed = (double)s.ElapsedTicks / (double)Stopwatch.Frequency;
Run Code Online (Sandbox Code Playgroud)


Eri*_*sch 5

你混淆了几件事。精度、准确度、频率和分辨率。

您可能有一个精确到十亿位小数的变量。但如果您无法实际测量那么小的数字,那么这就是精度和分辨率之间的差异。频率是每秒进行测量的次数,与分辨率有关。准确度是指给定样本与实际测量结果的接近程度。

因此,鉴于 DateTime 的精度远高于系统时钟,简单地说 DateTime.Now 不一定会给出准确的时间戳。然而,Windows 中有更高分辨率的计时器,并且 Stopwatch 类使用它们来测量经过的时间,因此如果您使用此类,您将获得更好的精度。

DateTime 没有“默认精度”。它只有一种精度,那就是它可以存储的最小值和最大值。DateTime 在内部将其值存储为单个值,并且该值被格式化为您想要显示的任何类型(秒、分钟、天、刻度线等......)。