无论UTC如何,我如何设置系统时间?

时间:2018-04-24 07:06:02

标签: c# .net datetime time system

我已经拥有了这个代码: Change system date programmatically

我有一个按钮,当我点击系统时间时必须更新。但正在发生的是我没有得到我想要的结果。

正如您在下面的代码中所看到的,我将日期和时间设置为 2018年4月25日凌晨1:00:00 ,但我得到的是 2018年4月25日9:00 :00 AM ,因为UTC增加的时间是我所在时区的+8。

如何将系统时间直接设置为 1:00:00 AM

[StructLayout(LayoutKind.Sequential)]
public 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;
}

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

private void UpdateSystemTime(DateTime dt)
{
    SYSTEMTIME st = new SYSTEMTIME();
    st.wYear = (ushort)dt.Year;
    st.wMonth = (ushort)dt.Month;
    st.wDay = (ushort)dt.Day;
    st.wHour = (ushort)dt.Hour;
    st.wMinute = (ushort)dt.Minute;
    st.wSecond = (ushort)dt.Second;

    SetSystemTime(ref st); // invoke this method.
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
    timeToSet = new DateTime(year, month, day, hour, minute, second, second, DateTimeKind.Utc);
    UpdateSystemTime(timeToSet);
}

1 个答案:

答案 0 :(得分:2)

请参阅SetSystemTime的{​​{3}}:

  

设置当前系统时间和日期。系统时间以协调世界时(UTC)表示。

这意味着您必须传递UTC,而不是本地时间(或传递的时间被解释为UTC)。

创建DateTime对象时,您传递了DateTimeKind.Utc,但这并不意味着您传递的值从本地转换为UTC时间,而是DateTime对象创建为UTC时间对象。当您将 1 AM 作为小时传递时,当您致电dt.Hour时,您仍然会 1 AM ,这将传递给SetSystemTime并解释为凌晨1点,而不是当地时间凌晨1点

如何克服这个?

您必须为当地时间创建DateTime,将其转换为UTC,然后将值传递给SetSystemTime

timeToSet = new DateTime(year, month, day, hour, minute, second, second, DateTimeKind.Local);
UpdateSystemTime(timeToSet.ToUniversalTime()); // this converts the local DateTime object to UTC