SetSystemTime - UTC或当地时间?

问题描述:

我从我的C#应用​​程序调用了SetSystemTime。但是,如果我将Windows时区设置为UTC以外的非零偏移量,有时可能会调整系统时钟,就好像我提供的时间是UTC(即转换为本地时间),而其他时间则不是这样,它只是将时间直接设置为date参数。SetSystemTime - UTC或当地时间?

[StructLayout(LayoutKind.Sequential)] 
    internal struct SystemTime 
    { 
     public short Year; 
     public short Month; 
     public short DayOfWeek; 
     public short Day; 
     public short Hour; 
     public short Minute; 
     public short Second; 
     public short Milliseconds; 
    } 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern bool SetSystemTime(ref SystemTime st); 

    public static bool AdjustSystemClock(DateTime date) 
    { 
     SystemTime systemTime = new SystemTime(); 
     systemTime.Year = (short)date.Year; 
     systemTime.Month = (short)date.Month; 
     systemTime.Day = (short)date.Day; 
     systemTime.Hour = (short)date.Hour; 
     systemTime.Minute = (short)date.Minute; 
     systemTime.Second = (short)date.Second; 
     return SetSystemTime(ref systemTime); 
    } 

的区别似乎是:当我使用的是Windows设置时区,然后启动应用程序,当我打电话SetSystemTime()它调整,如果它是UTC提供的时间。

但是,当我使用SetDynamicTimeZoneInformation()函数设置时区时,重新启动应用程序,然后调用SetSystemTime(),然后它将时间直接设置为我提供的时间,而不考虑时区。

这是预期的行为?如何在设置时区的两种方法之间获得一致性?

+0

SetSystemTime()几乎从不“直接将时间设置为我提供的时间”。它设置UTC时间。除非您居住在爱尔兰,位于UTC + 0时区。不完全是祝福。随机调用SetDynamicTimeZoneInformation()通常是不明智的,除非计算机位于飞机上:)使.NET程序知道时区更改需要重新启动它(与您一样)或调用CultureInfo.ClearCachedData + TimeZoneInfo.ClearCachedData。不要这样做。 –

+0

Windows计算机自动同步他们的时间。使用内置功能不是更安全吗?您可以更改同步频率或强制同步[通过设置和Win32tm工具](https://technet.microsoft.com/en-us/windows-server-docs/identity/ad-ds/get-started/windows -time-service/windows-time-service-tools-and-settings) –

我相信我发现了这个问题。

事实证明,编写代码位SetDynamicTimeZoneInformation()忽略设置Bias属性的人。

因此,设置的时区信息的UTC偏移量为零,因此不会进行调整。

+0

而不是自己设置时间,为什么不让操作系统自动执行它?域计算机自动与域控制器同步。独立计算机(或DC)与日期和时间设置中指定的时间服务器自动同步 –

+0

@PanagiotisKanavos - 我不是该应用程序的原始开发人员,但他们显然有这样做的充分理由。首先,它在专用设备(Windows Embedded 7)上,它不提供用户访问主Windows操作系统的权限。 (外壳应用程序在打开设备时加载此应用程序,然后在退出应用程序时关闭设备) – colmde

+0

Windows Embedded上也提供时间同步。检查这个SO问题:[在Windows嵌入式标准通过批处理或类似设置互联网时间服务器](http://*.com/questions/34016933/setting-internet-time-server-on-windows-embedded-standard-through-分批或-simil)。没有同步时钟,您不能使用SSL或任何其他形式的检查过期数据包的加密方式。这包括与域控制器的沟通。 –