C# GetLocalTime、Kernel32.dll和Windows7的准确度是多少?

C# GetLocalTime、Kernel32.dll和Windows7的准确度是多少?,c#,datetime,C#,Datetime,我想得到最准确的1ms精度将是一天中非常好的时间。 我看到了这个使用GetLocalTime的示例: using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public class SystemTime { public ushort year; public ushort month; public ushort weekday;

我想得到最准确的1ms精度将是一天中非常好的时间。 我看到了这个使用GetLocalTime的示例:

using System;
using System.Runtime.InteropServices;    

[StructLayout(LayoutKind.Sequential)]
public class SystemTime
{
    public ushort year;
    public ushort month;
    public ushort weekday;
    public ushort day;
    public ushort hour;
    public ushort minute;
    public ushort second;
    public ushort millisecond;
}

public class LibWrap
{
    [DllImport("Kernel32.dll")]
    public static extern void GetLocalTime([In, Out] SystemTime st);
}

public class App
{
    public static void Main()
    {
        SystemTime st = new SystemTime();
        LibWrap.GetLocalTime(st);
        Console.Write("{0}:{1}:{2}.{3}", st.hour, st.minute, st.second, st.millisecond);
        Console.ReadKey();
    }
}

准确度是多少?

很可能是计时器的准确度。在较新版本的windows上,默认值为16毫秒,随着时间的推移,时间可以减少到1毫秒,这可能会增加计算机的功耗

我知道windows上的所有绝对时间函数都以计时器的精度工作。所以我希望它不会比DateTime好,也不会比DateTime差

相对时间函数StopWatch、QueryPerformanceCounter具有更高的精度,但没有提供有意义的绝对时间。它们还可能遇到跨多个CPU核的同步问题


但是为什么不测试一下呢:编写一个小程序读取时间,并在时间增加时打印出来。对DateTime.Now执行同样的操作。并进行比较。

最有可能的是计时器精度。在较新版本的windows上,默认值为16毫秒,随着时间的推移,时间可以减少到1毫秒,这可能会增加计算机的功耗

我知道windows上的所有绝对时间函数都以计时器的精度工作。所以我希望它不会比DateTime好,也不会比DateTime差

相对时间函数StopWatch、QueryPerformanceCounter具有更高的精度,但没有提供有意义的绝对时间。它们还可能遇到跨多个CPU核的同步问题


但是为什么不测试一下呢:编写一个小程序读取时间,并在时间增加时打印出来。对DateTime.Now执行同样的操作。然后比较。

为什么不使用DateTime.Now属性?它的精度不超过15分钟,您需要特殊的硬件才能获得如此精确的绝对时钟。通常基于GPS接收机。它仍然只对驱动程序有用,Windows并不是用户模式下的实时操作系统,线程量为45毫秒。标准时钟分辨率为1/64秒,因为使其更精确是毫无意义的。@HansPassant,如果在我当前的硬件中,我将按照CodeInChaos的回答执行timeBeginPeriod1?多媒体计时器是增量计时器,而不是绝对时钟计时器。而且它也不能使时钟更精确。而且它仍然受到内核线程抢占用户模式线程的影响。拉里·奥斯特曼(Larry Osterman):你为什么不使用DateTime.Now属性呢?它不精确到15分钟,你需要特殊的硬件来获得如此精确的绝对时钟。通常基于GPS接收机。它仍然只对驱动程序有用,Windows并不是用户模式下的实时操作系统,线程量为45毫秒。标准时钟分辨率为1/64秒,因为使其更精确是毫无意义的。@HansPassant,如果在我当前的硬件中,我将按照CodeInChaos的回答执行timeBeginPeriod1?多媒体计时器是增量计时器,而不是绝对时钟计时器。而且它也不能使时钟更精确。而且它仍然受到内核线程抢占用户模式线程的影响。拉里·奥斯特曼:谢谢。你能给我举个例子说明如何使用timeBeginPeriod将精确度降低到1ms吗?只需调用timeBeginPeriod1。但请注意,这具有全局效应,并影响所有应用程序中的计时器精度。谢谢。你能给我举个例子说明如何使用timeBeginPeriod将精确度降低到1ms吗?只需调用timeBeginPeriod1。但请注意,这具有全局效应,并影响所有应用程序中的计时器精度。