如何在VC里进行系统时间设置。
<wbr></wbr>
1、使用API函数SetLocalTime进行本地时间设置。
1)SetLocalTime函数的原型:
BOOL SetLocalTime( const SYSTEMTIME *lpSystemTime );
输入参数lpSystemTime是一个SYSTEMTIME类型的参数,如果设置成功,返回true,本地时间将会变成lpSystemTime所指定的时间,否则返回false。看一下SYSTEMTIME的格式:
typedef struct _SYSTEMTIME {
<wbr><wbr><wbr> WORD wYear;<br><wbr><wbr><wbr> WORD wMonth;<br><wbr><wbr><wbr> WORD wDayOfWeek;<br><wbr><wbr><wbr> WORD wDay;<br><wbr><wbr><wbr> WORD wHour;<br><wbr><wbr><wbr> WORD wMinute;<br><wbr><wbr><wbr> WORD wSecond;<br><wbr><wbr><wbr> WORD wMilliseconds;<br>
} SYSTEMTIME, *PSYSTEMTIME;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>
2)我们来看一下如何利用SYSTEMTIME结构体和SetLocalTime函数进行本地时间的设置。
<wbr><strong>SYSTEMTIME st;<br><wbr>st.wYear = 2007;<br><wbr>st.wMonth = 11;<br><wbr>st.wDay = 24;<br><wbr>st.wHour = 3;<br><wbr>st.wMinute = 14;<br><wbr>st.wSecond = 0;</wbr></wbr></wbr></wbr></wbr></wbr></strong></wbr>
<wbr>st.wMilliseconds = 0;</wbr>
<wbr>SetSystemTime(&st);</wbr>
对比一下SYSTEMTIME结构体,可以发现,除wDayOfWeek成员之外,其它各成员都进行赋值了,甚至连wMilliseconds。使用这种方式进行系统时间设置时,会忽略wDayOfWeek成员,可以不进行该成员的赋值(即使你赋值了也不会被考虑的),但其它所有成员都必须时行赋值,否则无法成功地进行时间设置。
3)如果只想对其中的几项进行设置的话,可以先使用GetLocalTime函数来获取当前本地时间,然后再对相应的项进行修改,如下:
SYSTEMTIME st;
<wbr>GetLocalTime(&st);<br><wbr>st.wHour = 3;<br><wbr><span style="font-family:宋体">SetLocalTime(&st);</span></wbr></wbr></wbr>
4)上面说到的方法都是对每一项单独进行设置,在VC里面,也提供了一次性设置所有项的方法,使用COleDateTime类。
COleDateTime tm;
SYSTEMTIME st;
tm.ParseDateTime("2007-11-24 8:00:00");
tm.GetAsSystemTime(st);
SetLocalTime(&st);
有几个注意点要说明一下。
a)先是ParseDateTime,函数原型:
BOOL ParseDateTime(
LPCTSTR lpszDate,
DWORD dwFlags = 0,
LCID lcid = LANG_USER_DEFAULT );
lpszDate就是指定的日期时间了,可以有很多种形式,如:
"25 January 1996"
"8:30:00"
"20:30:00"
"January 25, 1996 8:30:00"
"8:30:00 Jan. 25, 1996"
"1/25/1996 8:30:00"<wbr></wbr>
b)dwFlags有三种值,LOCALE_NOUSEROVERRIDE、VAR_TIMEVALUEONLY、VAR_DATEVALUEONLY。LOCALE_NOUSEROVERRIDE是使用系统默认的方式,VAR_TIMEVALUEONLY是忽略日期,在该选项下,日期会被设置为0,也就是1899年12月30日,在VAR_DATEVALUEONLY下忽略时间,时间被设置为0,即午夜零点。<wbr></wbr>
c)至于第三个参数lcid,是指定转换方式,语言支持方面的,MSDN里面有个很详细的表,有兴趣可以去看看。<wbr></wbr>
d)COleDateTime还提供了获取时间的函数,如GetYear()之类的。<wbr></wbr>
e)注意一下,如果没有指定日期的话,转换后日期就自动变为0,也就是跑1899年去了,这可很危险啊。本来还想偷个懒不指定呢,谁知道怎么偷懒的告诉我一声啊。<wbr></wbr>
2、SetLocalTime与SetSystemTime的差别
SetSystemTime的用法与SetLocalTime基本相同,差别在于SetSystemTime所带的参数指定的是UTC时间(国际标准时间),也就是说,像我的电脑里指定的是东八区,这样的话,使用SetSystemTime设置之后,系统的时间,会比参数里所设置的时间快8个小时。
另外,这两个函数设置的时间,都是对本地机各个系统都有效的。本来很好奇windows系统下改了时间,linux下是不是也会跟着改呢。事实证明是这样的。<wbr></wbr>
3、使用COleDateTimeSpan类进行时间的加减。
COleDateTime tm;
COleDateTimeSpan ts;
tm.ParseDateTime("2007-11-24 8:00:00");
ts.SetDateTimeSpan(0,8,0,-14);
tm+=ts;
SYSTEMTIME st;
tm.GetAsSystemTime(st);
SetLocalTime(&st);<wbr></wbr>
这个程序也很易懂,不说什么了,你只要想清楚了是该加上这个时间差呢还是减去这个时间差就行了,我是经常转不过来啦。<wbr></wbr>
另外,似乎在XP下有权限问题,不是管理员账号的可能不能这样进行修改,这个我没有去试过,谁去试过了跟我说一下吧。<wbr></wbr>
最后补充一句,修改系统时间之后,编译时候容易出问题,最好是每次编译的时候把时间改回来了再重新编译,或者使用rebuild all,全部重新编译,要不很有可能即使你编译了,而得到的可执行文件还是修改之前的。
分享到:
相关推荐
这个是我在网上找了好久才找到的,很有用。欢迎下载
vc++获取和设置系统时间vc++获取和设置系统时间
VC获得系统时间 设置系统时间 计算时间差
vc编程源码 改变系统时间,挺好用的,我试过了
获取和设置系统时间,VC6.0工程,Microsoft Visual Studio 6.0
VC获取系统时间,获取时间,在界面上动态显示
VC获取时间很方便,里边有代码,谢谢大家的借鉴
最近主板电池没电了,所以每次开机时间都会恢复到出厂的时间。 手动修改又很麻烦,所以写了这个自动修改系统时间的小程序。
开机小助手 VC 开机弹出开机时间
VC6 用MFC写的获取系统时间(精确到秒)并显示 有源码和工程文件
vc时间函数,介绍常用的时间函数,包括系统时间,当地时间等。
VC与C++开发基础\计算两个时间点的时间间隔
vc 设定系统时间源码 比较简单 大家有空就看看吧
vc#2008中调用系统时间的代码,适用于广大vc2008爱好者,非常实用
用c++语言获取系统时间,比较方便的简单易懂的小应用
代码如下://根据返回的时间设置系统时间 void setTimeFromTP(ULONG ulTime) { FILETIME ft; SYSTEMTIME st; //将基准时间转换成windows文件时间 st.wYear = 1900; st.wMonth = 1; st....
这是一个用vc来获取电脑系统当前时间的小工具,确实很有用。
很早不用VC6了。最近有个十几年前的VC6项目需要改动,就又把VC6安装了回来,但是习惯了番茄助手...为了节约大家时间,再次特将我亲测在WIN10系统下能用的VC6及其助手分享给大家,希望能够帮到你。如遇到问题,欢迎留言
适用于版本号6.0.9782.0的devshl.dll。...VC6只枚举系统缺省字符集一致的字体,这导致选择字体时甚为不便.虽然说可以通过修改注册表,直接设置字体,但是总觉得有些遗憾,今天有点时间,就小小patch了一下.
一个用于保护系统的时间,小程序,可以用于保护软件注册权的地方,总的说,应用面还是比较广!~