【问题标题】:Why does SetSystemTime() behave differently in the Afternoons?为什么 SetSystemTime() 在下午的行为不同?
【发布时间】:2018-06-07 08:36:36
【问题描述】:

我编写了以下类来更改系统日期时间,但我不明白为什么它在一天中的不同时间会有所不同:

  • 早上:传递给SetTime() 的确切时间被设置为系统时间。
  • 下午:传递给SetTime() +1Hr 的时间被设置为系统时间,额外的一小时从何而来?

.

public class SystemDateTimeController
{        

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
private extern static bool Win32SetSystemTime(ref SYSTEMTIME sysTime);       


    private struct SYSTEMTIME
    {
        public ushort wYear;
        public ushort wMonth;
        public ushort wDayOfWeek;
        public ushort wDay;
        public ushort wHour;
        public ushort wMinute;
        public ushort wSecond;
        public ushort wMilliseconds;
    }

    public static void SetTime(DateTime NewDateTime)
    {
        try
        {
            SYSTEMTIME systime = new SYSTEMTIME();

            systime.wMilliseconds = (ushort)NewDateTime.Millisecond;
            systime.wSecond = (ushort)NewDateTime.Second;
            systime.wMinute = (ushort)NewDateTime.Minute;
            systime.wHour = (ushort)NewDateTime.Hour;

            systime.wDayOfWeek = (ushort)NewDateTime.DayOfWeek;

            systime.wDay = (ushort)NewDateTime.Day;
            systime.wMonth = (ushort)NewDateTime.Month;
            systime.wYear = (ushort)NewDateTime.Year;

            Win32SetSystemTime(ref systime);
        }
        catch (Exception e)
        {
            Log("Failed to set system date time to: " + NewDateTime.ToString() + ". Exception: " + e.ToString());
        }

    }

}

我知道传递给SetTime() 的确切时间,以及用于测试目的并消除与源有关的任何可能性,我什至传递了一个硬编码字符串:Convert.ToDateTime("07/06/2018 13:00:00");

【问题讨论】:

  • 我们不知道你的代码做了什么。您显示的代码按预期工作。据推测,您的输入是当地时间,但 SetSystemTime 需要 UTC。我们看不到被破坏的代码。显示minimal reproducible example
  • @IInspectable 我试图设置的是本地 DateTime,我假设该方法采用 DateTime 原样并将其设置为系统时间,而不关心它是基于 UTC 还是基于本地时间。显然我错了。

标签: c# winapi windows-10


【解决方案1】:

SetSystemTime 需要 UTC。 OP 正在本地时间喂它,这就是问题所在(感谢@IInspectable

为了您的目的,最好使用SetLocalTime 它始终使用您当地的时区。

问候

【讨论】:

  • SetSystemTime 不会混淆时区。它需要 UTC。正如他们的硬编码字符串所示,OP 正在本地时间提供它。
  • @IInspectable 这很有意义,谢谢。
  • SetLocalTime 有完全相同的问题。你把它传递给UTC,所有的赌注都被取消了。如果您的方法采用 DateTime,请评估其 Kind 属性,然后调用相应的 API,或手动应用所需的调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2020-04-27
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
相关资源
最近更新 更多