Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么SetSystemTime()在下午的行为会有所不同?_C#_Winapi_Windows 10 - Fatal编程技术网

C# 为什么SetSystemTime()在下午的行为会有所不同?

C# 为什么SetSystemTime()在下午的行为会有所不同?,c#,winapi,windows-10,C#,Winapi,Windows 10,我写了下面的类来更改系统日期时间,但我不明白为什么它在一天中的不同时间运行不同: 早晨:传递到SetTime()的确切时间设置为系统时间 下午:传递到SetTime()+1Hr的时间被设置为系统时间,额外的一小时从何而来 我知道传递到SetTime()的确切时间,为了测试Purposes和消除与源代码相关的任何可能性,我甚至传递了一个硬编码字符串:Convert.ToDateTime(“07/06/2018 13:00:00”)设置系统时间预期UTC。OP在当地时间为它提供信息,这就是问题

我写了下面的类来更改系统日期时间,但我不明白为什么它在一天中的不同时间运行不同:

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


我知道传递到
SetTime()
的确切时间,为了测试Purposes和消除与源代码相关的任何可能性,我甚至传递了一个硬编码字符串:
Convert.ToDateTime(“07/06/2018 13:00:00”)

设置系统时间预期UTC。OP在当地时间为它提供信息,这就是问题所在(多亏了)

为了您的目的,请更好地使用 始终使用您的本地时区


问候语

设置系统时间
不会干扰时区。它期望UTC。OP正在输入本地时间,正如他们硬编码的字符串所示。@IInspectable这使它现在有意义了,谢谢。
SetLocalTime
也有同样的问题。你通过UTC,所有的赌注都输掉了。如果您的方法采用了,请评估其属性,并调用适当的API,或手动应用所需的调整。我们不知道您的代码是做什么的。您显示的代码按预期工作。您的输入可能是本地时间,但
SetSystemTime
需要UTC。我们看不到被破坏的代码。Show a.@IInspectable我试图设置的是本地日期时间,我假设该方法采用日期时间,并将其设置为系统时间,而不考虑是基于UTC还是基于本地时间。显然我错了。
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());
        }

    }

}