【问题标题】:SetSystemTime - UTC or local time?SetSystemTime - UTC 还是本地时间?
【发布时间】:2017-03-22 12:21:54
【问题描述】:

我从我的 c# 应用程序调用了 SetSystemTime。但是,如果我将 Windows 时区设置为与 UTC 的非零偏移量,有时似乎会调整系统时钟,就好像我提供的时间是 UTC(即转换为本地时间),而其他时候则不是,它只是直接将时间设置为date参数。

    [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() 然后它会直接将时间设置为我提供的时间,而不考虑时区。

这是预期的行为吗?如何使两种设置时区的方法保持一致?

【问题讨论】:

  • SetSystemTime() 几乎从不“将时间直接设置为我提供的时间”。它设置 UTC 时间。除非您居住在 UTC+0 时区的爱尔兰。不完全是祝福。除非计算机位于飞机上,否则随机调用 SetDynamicTimeZoneInformation() 通常是不明智的 :) 使 .NET 程序知道时区更改需要重新启动它(就像您所做的那样)或调用 CultureInfo.ClearCachedData + TimeZoneInfo.ClearCachedData。不要这样做。
  • Windows 计算机自动同步时间。使用内置功能不是更安全吗?您可以更改同步频率或强制同步through settings and the Win32tm tool

标签: c# .net datetime kernel32


【解决方案1】:

我相信我找到了问题所在。

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

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

【讨论】:

  • 与其自己设置时间,不如让操作系统自动设置时间?域计算机自动与域控制器同步。独立计算机(或 DC)自动与日期和时间设置中指定的时间服务器同步
  • @PanagiotisKanavos - 我不是该应用程序的原始开发人员,但他们显然有充分的理由这样做。一方面,它位于专用设备 (Windows Embedded 7) 上,不提供用户访问主 Windows 操作系统的权限。 (外壳应用程序在打开设备时加载此应用程序,然后在退出应用程序时关闭设备)
  • 时间同步在 Windows Embedded 上也可用。检查这个 SO 问题:Setting internet time server on windows embedded standard through batch or similar。如果没有同步时钟,您将无法使用 SSL 或任何其他形式的加密来检查过期数据包。这包括与域控制器的通信。
  • @colmde 你能发布你的整个解决方案吗?
  • @BNT - 抱歉,我不确定我现在是否可以访问相同的代码,但我会看看,但要解释一下,当应用程序首先设置时区时, 有一个对 SetDynamicTimeZoneInformation() 的调用,它有一个参数是 DYNAMIC_TIME_ZONE_INFORMATION 结构 - 它具有诸如 Bias 之类的属性,这是从 UTC 和 StandardBiasDaylightBias 偏移的分钟数。拨打电话时需要正确设置这些 - 希望这会有所帮助。见msdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2013-08-26
  • 2011-08-13
  • 2015-07-26
相关资源
最近更新 更多