如何通过C#修改Windows操作系统时间

  C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员。用过VC、VB等的朋友可能知道,我们可以调用Win32 API SetLocalTime来改变系统时间,看来C#中也只能如此了。SetLocalTime需要一个SYSTEMTIME结构指针作为参数,这倒不难,我们可以“比葫芦画瓢”很快在C#中定义这个结构,但问题是,我同时还想“享受”.NET Framework的System.DateTime在时间转换和处理方面的便利,怎么办?只有自己动手了,为我们的C#中的  SYSTEMTIME编写成员函数,实现和System.DateTime之间的互转。请看下面的代码:
  首先我为了以后调用方便,新建了一个C#类库文件,在里面把SetLocalTime API放到一个名称为Win32API的类中,并把这个类放到我自己定义的namespace中,避免名称冲突。以后我还可以不断向这个类和名称空间添加常用的API,以便构造我自己的C# Win32 API函数库。
{
    /// <summary>
    /// 
    /// </summary>
    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;
 
        /// <summary>
        /// 从System.DateTime转换。
        /// </summary>
        /// <param name="time">System.DateTime类型的时间。</param>
        public void FromDateTime(DateTime time)
        {
            wYear = (ushort)time.Year;
            wMonth = (ushort)time.Month;
            wDayOfWeek = (ushort)time.DayOfWeek;
            wDay = (ushort)time.Day;
            wHour = (ushort)time.Hour;
            wMinute = (ushort)time.Minute;
            wSecond = (ushort)time.Second;
            wMilliseconds = (ushort)time.Millisecond;
        }
        /// <summary>
        /// 转换为System.DateTime类型。
        /// </summary>
        /// <returns></returns>
        public DateTime ToDateTime()
        {
            return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
        }
        /// <summary>
        /// 静态方法。转换为System.DateTime类型。
        /// </summary>
        /// <param name="time">SYSTEMTIME类型的时间。</param>
        /// <returns></returns>
        public static DateTime ToDateTime(SYSTEMTIME time)
        {
            return time.ToDateTime();
        }
    }
 public class Win32API
    {
        [DllImport("Kernel32.dll")]
        public static extern bool SetLocalTime( ref SYSTEMTIME Time );
        [DllImport("Kernel32.dll")]
        public static extern void GetLocalTime(ref SYSTEMTIME Time);
    }
}

然后再需要的地方通过调用如下方法中间的核心代码来实现修改Windows操作系统时间,例如,通过Button的Click事件实现修改Windows操作系统时间:

private void button1_Click(object sender, System.EventArgs e)
{
    //取得当前系统时间
    DateTime t = DateTime.Now;
    //在当前时间上加上一周
    t = t.AddDays(7);
    //转换System.DateTime到SYSTEMTIME
    SYSTEMTIME st = new SYSTEMTIME();
    st.FromDateTime(t);
    //调用Win32 API设置系统时间
    Win32API.SetLocalTime(ref st);
    //显示当前时间
    MessageBox.Show(DateTime.Now.ToString());
}

 

 
posted @ 2020-10-24 21:53  rainbow70626  阅读(3429)  评论(0编辑  收藏  举报