C# 无论UTC如何设置系统时间?

C# 无论UTC如何设置系统时间?,c#,.net,datetime,time,system,C#,.net,Datetime,Time,System,我已经有了以下代码: 我有一个按钮,当我点击系统时间必须更新。但现在的情况是,我没有得到我想要的结果 正如您在下面的代码中所看到的,我将日期和时间设置为2018年4月25日凌晨1:00,但我得到的是2018年4月25日上午9:00,因为UTC增加的时间在我的时区为+8 如何将系统时间直接设置为1:00:00AM [StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear;

我已经有了以下代码:

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

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

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

[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);
}
请参阅设置系统时间的功能:

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

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

创建
DateTime
对象时,传递了
DateTimeKind.Utc
,但这并不意味着传递的值将从本地时间转换为Utc时间,而是将
DateTime
对象创建为Utc时间对象。当您将凌晨1点作为小时数时,当您调用
dt.hour
时,仍然会得到凌晨1点,该时间会传递到
SetSystemTime
并解释为UTC凌晨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
请参阅设置系统时间的功能:

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

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

创建
DateTime
对象时,传递了
DateTimeKind.Utc
,但这并不意味着传递的值将从本地时间转换为Utc时间,而是将
DateTime
对象创建为Utc时间对象。当您将凌晨1点作为小时数时,当您调用
dt.hour
时,仍然会得到凌晨1点,该时间会传递到
SetSystemTime
并解释为UTC凌晨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

现在很好用。谢谢但万一我现在改变了时区。使用此代码时是否会遇到任何问题?
DateTimeKind.Local
将始终根据您的系统设置引用本地时间,因此在任何情况下转换为UTC都应该是正确的。请记住,如果系统设置中的时区为“错误”,则时间将设置为“错误”值,但是你对此无能为力(系统实际上是在对程序“撒谎”),它现在运行良好。谢谢但万一我现在改变了时区。使用此代码时是否会遇到任何问题?
DateTimeKind.Local
将始终根据您的系统设置引用本地时间,因此在任何情况下转换为UTC都应该是正确的。请记住,如果系统设置中的时区为“错误”,则时间将设置为“错误”值,但是你对此无能为力(系统实际上是在“欺骗”程序)。你为什么要尝试按程序设置系统时间?所有现代Windows操作系统都能够自动设置时间。除非该设置已禁用(不应禁用),然后,当时钟再次同步时,您通过此处代码所做的任何调整最终都将被覆盖。我正在开发的应用程序将是唯一在操作系统上运行的应用程序,并且大多数功能将被禁用,包括win explorer,因此用户修改时间的唯一方法是通过应用程序。我将使用Windows10作为它的基本操作系统。顺便问一下,您对如何安全地启用/禁用windows自动时间同步有何建议?这是设置页面中的第一个设置,但除非您完全断开与所有网络的连接,否则我强烈建议您保持打开状态并自动设置时间。没有准确的时间,很多事情都会失败。例如,SSL证书有过期日期,Kerberos身份验证只有5分钟的容差。很多其他事情…很抱歉,我没有说明如何禁用/启用自动同步。由于Windows 10的大部分UI都将被禁用,因此我希望通过代码完成所有这一过程。因为在我的应用程序的时间设置中,有一个选项可以自动更新时间或不更新时间。这是我第一次通过代码访问系统的日期/时间,因此请告知我如何正确访问。您需要禁用Windows时间服务,如果您搜索,StackOverflow上的其他答案将显示给您。同样,我建议不要这样做。为什么你要尝试按程序设置系统时间呢?所有现代Windows操作系统都能够自动设置时间。除非该设置已禁用(不应禁用),然后,当时钟再次同步时,您通过此处代码所做的任何调整最终都将被覆盖。我正在开发的应用程序将是唯一在操作系统上运行的应用程序,并且大多数功能将被禁用,包括win explorer,因此用户修改时间的唯一方法是通过应用程序。我将使用Windows10作为它的基本操作系统。顺便问一下,您对如何安全地启用/禁用windows自动时间同步有何建议?这是设置页面中的第一个设置,但除非您完全断开与所有网络的连接,否则我强烈建议您保持打开状态并自动设置时间。没有准确的时间,很多事情都会失败。例如,SSL证书有过期日期,Kerberos身份验证只有5分钟的容差。很多其他事情…很抱歉,我没有说明如何禁用/启用自动同步。由于Windows 10的大多数UI都将被禁用,因此我希望通过代码完成所有这一过程