这种问题百度一下到处都是啊。
先是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"
dwFlags有三种值,LOCALE_NOUSEROVERRIDE、VAR_TIMEVALUEONLY、
VAR_DATEVALUEONLY。LOCALE_NOUSEROVERRIDE是使用系统默认的方式,VAR_TIMEVALUEONLY是忽略日
期,在该选项下,日期会被设置为0,也就是1899年12月30日,在VAR_DATEVALUEONLY下忽略时间,时间被设置为0,即午夜零点。
至于第三个参数lcid,是指定转换方式,语言支持方面的,MSDN里面有个很详细的表,有兴趣可以去看看。
COleDateTime还提供了获取时间的函数,如GetYear()之类的。
注意一下,如果没有指定日期的话,转换后日期就自动变为0,也就是跑1899年去了,这可很危险啊。本来还想偷个懒不指定呢,谁知道怎么偷懒的告诉我一声啊。
SetLocalTime函数的原型: BOOL SetLocalTime( const SYSTEMTIME
lpSystemTime );
输入参数lpSystemTime是一个SYSTEMTIME类型的参数,如果设置成功,返回true,本地时间将会变成lpSystemTime所指定
的时间,否则返回false。看一下SYSTEMTIME的格式: typedef struct _SYSTEMTIME { WORD wYear;
WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD
wSecond; WORD wMilliseconds; } SYSTEMTIME, PSYSTEMTIME; 各成员的含义不用解释了吧。
我们来看一下如何利用SYSTEMTIME结构体和SetLocalTime函数进行本地时间的设置。 SYSTEMTIME st;
stwYear = 2007; stwMonth = 11; stwDay = 24; stwHour = 3; stwMinute =
14; stwSecond = 0; stwMilliseconds = 0; SetSystemTime(&st);
对比一下SYSTEMTIME结构体,可以发现,除wDayOfWeek成员之外,其它各成员都进行赋值了,甚至连wMilliseconds。使用这种
方式进行系统时间设置时,会忽略wDayOfWeek成员,可以不进行该成员的赋值(即使你赋值了也不会被考虑的),但其它所有成员都必须时行赋值,否则
无法成功地进行时间设置。
如果只想对其中的几项进行设置的话,可以先使用GetLocalTime函数来获取当前本地时间,然后再对相应的项进行修改,如下:
SYSTEMTIME st; GetLocalTime(&st); stwHour = 3;
SetLocalTime(&st); 这样的方式比上面方便多了。
上面说到的方法都是对每一项单独进行设置,在VC里面,也提供了一次性设置所有项的方法,使用COleDateTime类。
COleDateTime tm; SYSTEMTIME st; tmParseDateTime("2007-11-24 8:00:00");
tmGetAsSystemTime(st); SetLocalTime(&st); 程序应该很好懂吧,不过有几个注意点要说明一下。
SetLocalTime与SetSystemTime的差别
SetSystemTime的用法与SetLocalTime基本相同,不重复了。差点在于SetSystemTime所带的参数指定的是UTC时间(国
际标准时间),也就是说,像我的电脑里指定的是东八区,这样的话,使用SetSystemTime设置之后,系统的时间,会比参数里所设置的时间快8个小
时。
另外,这两个函数设置的时间,都是对本地机各个系统都有效的。本来很好奇windows系统下改了时间,linux下是不是也会跟着改呢。事实证明是这样
的。
使用COleDateTimeSpan类进行时间的加减。 COleDateTime tm; COleDateTimeSpan ts;
tmParseDateTime("2007-11-24 8:00:00"); tsSetDateTimeSpan(0,8,0,-14);
tm+=ts; SYSTEMTIME st; tmGetAsSystemTime(st); SetLocalTime(&st);
这个程序也很易懂,不说什么了,你只要想清楚了是该加上这个时间差呢还是减去这个时间差就行了,我是经常转不过来啦。
另外,似乎在XP下有权限问题,不是管理员账号的可能不能这样进行修改,这个我没有去试过,谁去试过了跟我说一下吧。
最后补充一句,修改系统时间之后,编译时候容易出问题,最好是每次编译的时候把时间改回来了再重新编译,或者使用rebuild
all,全部重新编译,要不很有可能即使你编译了,而得到的可执行文件还是修改之前的
因为什么,因为在内核下的运行通常是进程轮询线程是否有任务,时间很短,而在用户下的运行时间通常是用户触发线程的运行,同样通常也是很快就完成,所以楼主这样求得的仅仅是进程实际运行时间,至于创建的时间可以这样求:一种情况是关闭了的,即exittime-starttime(抽象化语言,楼主应该能懂),一种情况是进程未关闭,楼主可获取当前时间再减去创建时间点即可。
计算前和计算后分别获取当前时间,然后用时间相减
inline __int64 TimeDiff(SYSTEMTIME left,SYSTEMTIME right)
{
CTime tmLeft(leftwYear,leftwMonth,leftwDay,0,0,0);
CTime tmRight(leftwYear,leftwMonth,leftwDay,0,0,0);
CTimeSpan sp;
sp = tmLeft - tmRight;//计算日期比较麻烦,就交给MFC去做吧
long lLMinllis = (leftwHour3600 + leftwMinute60 + leftwSecond)1000 + leftwMilliseconds;
long lRMinllis = (rightwHour3600 + rightwMinute60 + rightwSecond)1000 + rightwMilliseconds;
return (__int64)spGetDays()86400000 + (lLMinllis - lRMinllis);
}
void CMainrDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
CString str;
CTime theTime=CTime::GetCurrentTime();
strFormat("%02d:%02d:%02d",theTimeGetHour(),theTimeGetMinute(),theTimeGetSecond());
SetDlgItemText(IDC_STATIC_TIME,str);
}
以上就是关于如何通过mfc应用程序修改系统时间的菜单选项就电脑右下角右键点击系统时间时d出的菜单。。。100分送上全部的内容,包括:如何通过mfc应用程序修改系统时间的菜单选项就电脑右下角右键点击系统时间时d出的菜单。。。100分送上、mfc获取进程运行时间、mfc计算运算时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)