通过调用系统API设置系统时间。using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;namespace talefox.ShareLib{
    public class SystemDateTime
    {
        [DllImport("kernel32.dll")]
        private static extern bool SetLocalTime(ref SYSTEMTIME time);        [StructLayout(LayoutKind.Sequential)]
        private struct SYSTEMTIME
        {
            public short year;
            public short month;
            public short dayOfWeek;
            public short day;
            public short hour;
            public short minute;
            public short second;
            public short milliseconds;
        }
        /// <summary>
        /// 设置系统时间
        /// </summary>
        /// <param name="dt"></param>
        public static void SetDate(DateTime dt)
        {
            SYSTEMTIME st;            st.year = (short)dt.Year;
            st.month = (short)dt.Month;
            st.dayOfWeek = (short)dt.DayOfWeek;
            st.day = (short)dt.Day;
            st.hour = (short)dt.Hour;
            st.minute = (short)dt.Minute;
            st.second = (short)dt.Second;
            st.milliseconds = (short)dt.Millisecond;            SetLocalTime(ref st);
        } 
    }
}

解决方案 »

  1.   

    楼上的朋友,感谢你的回复,但是我看你的代码和我的没什么本质区别,关键问题是调用了  SetLocalTime(ref st);
    方法后,时间仍然没有改变,这是我现在困惑的问题.
      

  2.   

    SYSTEMTIME 结构的定义不同LZ 用的是无符号,标准定义应该是2楼的那种。
    在API种结构的定义还是比较严格的,数据类型不同可能会导致内存读写错误,而无法正确调用相应的API函数。
      

  3.   

    楼主,用下面测试用例,执行完,系统时间是否是五年后的今天.private void button1_Click(object sender, EventArgs e)
    {
       SetDate(DateTime.Now.AddYears(5)); 
    }
    如果没改变,可以有其他程序影响(系统时间保护程序).
      

  4.   

    我只知道用wmi修改系统时间和重启系统需要有特殊权限,而wmi里只要设置一个属性=true就可以了,api不清楚
      

  5.   

    你用administrator组成员登陆看看
      

  6.   

    恢复组策略修改时间的权限
    开始→运行→输入"gpedit.msc" 打开组策略,依次打开计算机配置→windows设置→安全设置→本地策略→用户权利指派,然后找到"更改系统时间",双击"更改系统时间",点击"添加用户或组",把你的系统用户名添加进去就可以更改系统时间了。