我已经拥有了这个代码: 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);
}
答案 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