api函数setsystemtime()与setlocaltime()有何区别?
答案:2 悬赏:0 手机版
解决时间 2021-03-16 13:10
- 提问者网友:暗中人
- 2021-03-15 19:30
api函数setsystemtime()与setlocaltime()有何区别?
最佳答案
- 五星知识达人网友:一秋
- 2021-03-15 20:31
C#没有提供直接的方法对系统时间进行设定,一般我们只能通过DateTime.Now获取系统时间,但是并不能对这个时间进行修改。这里对了解的主要的两种方式做了个整理,希望对大家有帮助。
方法一,用API函数的方式来修改时间。
首先定义API函数
[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;
public void FromDateTime(DateTime dateTime)
{
wYear = (ushort)dateTime.Year;
wMonth = (ushort)dateTime.Month;
wDayOfWeek = (ushort)dateTime.DayOfWeek;
wDay = (ushort)dateTime.Day;
wHour = (ushort)dateTime.Hour;
wMinute = (ushort)dateTime.Minute;
wSecond = (ushort)dateTime.Second;
wMilliseconds = (ushort)dateTime.Millisecond;
}
public DateTime ToDateTime()
{
return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond);
}
}
//设定,获取系统时间,SetSystemTime()默认设置的为UTC时间,比北京时间少了8个小时。
[DllImport("Kernel32.dll")]
public static extern bool SetSystemTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern void GetSystemTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SYSTEMTIME time);
调用API函数,这里主要要注意SetSystemTime和SetLocalTime,以及GetSystemTime和GetLocalTime的区别,尽量从测试结果中去分析比较。一般情况下我们就用SetLocalTime和GetLocalTime。
{
SYSTEMTIME st = new SYSTEMTIME();
Win32.GetLocalTime(ref st);
System.Diagnostics.Debug.WriteLine("GetLocalTime()");
System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));
Win32.GetSystemTime(ref st);
System.Diagnostics.Debug.WriteLine("GetSystemTime()");
System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));
DateTime dt = Convert.ToDateTime("2011/12/12 12:15:20");
System.Diagnostics.Debug.WriteLine("test time:2011/12/12 12:15:20");
st.FromDateTime(dt);
Win32.SetLocalTime(ref st);
System.Diagnostics.Debug.WriteLine("SetLocalTime()");
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
Win32.SetSystemTime(ref st);
System.Diagnostics.Debug.WriteLine("SetSystemTime()");
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
测试结果:
GetLocalTime()
2011/12/12 20:16:00
GetSystemTime()
2011/12/12 12:16:00 //获取的时候比北京时间少8小时
test time:2011/12/12 12:15:20
SetLocalTime()
2011/12/12 12:15:20
SetSystemTime() //设定的时候比北京时间多8小时
2011/12/12 20:15:20
方法二,cmd命令的方式
这种方式可以用Process类调用cmd,以执行Window脚本的方式来改变系统时间,这种方式对于对批处理命令比较熟的人相当实用。代码如下:
ProcessStartInfo PstartInfoCmd = new ProcessStartInfo();
PstartInfoCmd.FileName = "cmd.exe";
PstartInfoCmd.Arguments = "/C date " + createDateTime.ToShortDateString() ;
PstartInfoCmd.WindowStyle = ProcessWindowStyle.Hidden;
Process proStep1 = new Process();
proStep1.StartInfo = PstartInfoCmd;
proStep1.Start();
主要用了一句“ date 日期”脚本命令,注意cmd的/C开关,代表的是执行完就关闭cmd窗口,否则如果调用了Process 的WaitForExit()等方法可能会阻塞。
方法一,用API函数的方式来修改时间。
首先定义API函数
[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;
public void FromDateTime(DateTime dateTime)
{
wYear = (ushort)dateTime.Year;
wMonth = (ushort)dateTime.Month;
wDayOfWeek = (ushort)dateTime.DayOfWeek;
wDay = (ushort)dateTime.Day;
wHour = (ushort)dateTime.Hour;
wMinute = (ushort)dateTime.Minute;
wSecond = (ushort)dateTime.Second;
wMilliseconds = (ushort)dateTime.Millisecond;
}
public DateTime ToDateTime()
{
return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond);
}
}
//设定,获取系统时间,SetSystemTime()默认设置的为UTC时间,比北京时间少了8个小时。
[DllImport("Kernel32.dll")]
public static extern bool SetSystemTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern void GetSystemTime(ref SYSTEMTIME time);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SYSTEMTIME time);
调用API函数,这里主要要注意SetSystemTime和SetLocalTime,以及GetSystemTime和GetLocalTime的区别,尽量从测试结果中去分析比较。一般情况下我们就用SetLocalTime和GetLocalTime。
{
SYSTEMTIME st = new SYSTEMTIME();
Win32.GetLocalTime(ref st);
System.Diagnostics.Debug.WriteLine("GetLocalTime()");
System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));
Win32.GetSystemTime(ref st);
System.Diagnostics.Debug.WriteLine("GetSystemTime()");
System.Diagnostics.Debug.WriteLine(st.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"));
DateTime dt = Convert.ToDateTime("2011/12/12 12:15:20");
System.Diagnostics.Debug.WriteLine("test time:2011/12/12 12:15:20");
st.FromDateTime(dt);
Win32.SetLocalTime(ref st);
System.Diagnostics.Debug.WriteLine("SetLocalTime()");
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
Win32.SetSystemTime(ref st);
System.Diagnostics.Debug.WriteLine("SetSystemTime()");
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
测试结果:
GetLocalTime()
2011/12/12 20:16:00
GetSystemTime()
2011/12/12 12:16:00 //获取的时候比北京时间少8小时
test time:2011/12/12 12:15:20
SetLocalTime()
2011/12/12 12:15:20
SetSystemTime() //设定的时候比北京时间多8小时
2011/12/12 20:15:20
方法二,cmd命令的方式
这种方式可以用Process类调用cmd,以执行Window脚本的方式来改变系统时间,这种方式对于对批处理命令比较熟的人相当实用。代码如下:
ProcessStartInfo PstartInfoCmd = new ProcessStartInfo();
PstartInfoCmd.FileName = "cmd.exe";
PstartInfoCmd.Arguments = "/C date " + createDateTime.ToShortDateString() ;
PstartInfoCmd.WindowStyle = ProcessWindowStyle.Hidden;
Process proStep1 = new Process();
proStep1.StartInfo = PstartInfoCmd;
proStep1.Start();
主要用了一句“ date 日期”脚本命令,注意cmd的/C开关,代表的是执行完就关闭cmd窗口,否则如果调用了Process 的WaitForExit()等方法可能会阻塞。
全部回答
- 1楼网友:爱难随人意
- 2021-03-15 21:14
当然能了,我就在用。如果是在NT上,则需要相应的权限。至于区别,看看帮助不就一目了然了吗? 查看原帖>>
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯