我可以将系统时间精确​​到毫秒吗?

时间:2013-08-01 09:24:08

标签: .net vb.net datetime

我有一台显示当前时间/日期的显示器,以及一个随机幻灯片。幻灯片开始时,它会创建一个目录中所有图像文件的列表,随机化它,然后从中弹出图片直到它为空,此时它将生成一个新图像文件。它以特定间隔弹出图片。

我看到一张能拍出令人敬畏的背景图片的照片,我想找到它。问题是我得到了大约50 GB的图片,我不会手动搜索它们。

所以我的计划是在幻灯片中找到随机对象的种子。如果未在随机对象构造函数中指定种子,它将使用Enviroment.TickCount属性,该属性返回自系统启动以来的毫秒数。

当图片在屏幕上时我非常了解,并且进程记住它们开始的时间,所以我实际上可以计算随机对象的种子。我还记得幻灯片序列中的最后一张图片,由于在生成新序列时有5秒的延迟,所以我可以很容易地看到我的种子是否合适。

然而,DateTime.Now似乎没有达到毫秒级,所以如果我能解决这个问题,我将不得不检查更少的图片。

Sub Main()
    Dim SystemStartTime = Now.AddMilliseconds(-Environment.TickCount)

    Console.WriteLine(SystemStartTime.Millisecond) REM Prints different numbers each time. They should be equal
    Console.ReadLine()
End Sub

1 个答案:

答案 0 :(得分:0)

Environment.TickCount有点难以正确使用。因为它是一个32位有符号整数,所以最大值为2,147,483,647个刻度,大约为24.9天。下一个勾号将是-2,147,483,648,这是否定。因此,您不能将其添加到DateTime而不会有错误的风险。听起来你的代码可能会在某种自助服务终端显示器上运行,这种显示器肯定会一次运行几个月。请参阅these MSDN docs以供参考。

另一个问题 - DateTime.Now会返回本地日期/时间。它被调整到计算机的时区,这可能会有夏令时的波动。如果你打算完全根据时钟,你应该使用DateTime.UtcNow代替。

关于精度 - 虽然DateTime类型具有非常精细的精度(1000万个刻度== 1秒),但Windows系统时钟仅准确到大约10到30毫秒(取决于您的硬件和Windows版本)。无法保证完全如何准确读取您将获得的内容。即使您从时钟获得非常精确的精度,您仍然需要考虑时钟漂移,并记住用户可以随时更改时钟。即使您通过互联网定期同步时钟,也无法保证这种准确度。

您可能需要阅读this MSDN article。另外,您可以阅读on accuracy vs precision

顺便说一句 - 如果你真的想要高精度高精度,你需要stratum 0时间源,例如this company和其他人出售的时间源。我完全相信这对你描述的应用程序来说太过分了。