Delphi的“现在”时间戳有多准确

时间:2013-01-29 00:15:43

标签: delphi timestamp

我将要开展一个项目,该项目需要(相当)准确地为来自定制硬件的传入RS232串行和网络数据加盖时间戳。由于数据来自多个独立的硬件源,我需要为所有数据加时间戳,以便可以对其进行校正/插值到标称时间点。

我的直接目的只是使用内置的Now命令来设置时间戳,但是快速的Google似乎表明这只能准确到大约50毫秒左右。

不幸的是,我读的越多,我就越困惑。在GetTickCount和QueryPerformanceCounter上似乎存在许多相互矛盾的建议,由于当今的多核处理器和CPU限制而引发复杂化。我也看过推荐使用Windows多媒体计时器的帖子,但我似乎找不到任何代码片段来做这件事。

所以,有人可以告诉我:

1)“现在”的准确程度如何。

2)是否存在简单,更高精度的替代方案。

注意:我希望时间戳到10毫秒内,我不是在寻找一个计时器,只是一个更好的时间戳方法。这将在Windows 7 32位低功耗微型PC上运行。如果它有任何不同,我将使用Delphi XE或Delphi 2007。

1 个答案:

答案 0 :(得分:10)

根据文件记录,Now仅与最近的第二个一样准确:

  

虽然TDateTime值可以表示毫秒,但现在仅精确到最接近的秒。

尽管如此,看看当前的实现,现在和GetLocalTime Windows API一样准确。

进行快速测试,它显示现在返回时钟中每毫秒的值,例如:

begin
  System.SysUtils.FormatSettings.LongTimeFormat := 'hh:mm:ss.zzz';
  for I := 1 to 5000 do
    Writeln(TimeToStr(Now()));
end.

当我从命令行project1 >times.txt执行此控制台程序时,在Windows 7 64位计算机中,我得到一个连续29毫秒的文件(文件中没有人丢失)。

您必须面对在Windows环境中运行的事实,您的应用程序/线程可能会在两者之间获得不同时间的处理器片,具体取决于系统的繁忙程度以及应用程序/线程与所有其他线程的优先级在系统中运行。