MFC下,常用的获取时间方式有以下几种三种:
SYSTEMTIME sysTm, locTm;
1. GetSystemTime(&sysTm); //获取格林威治标准时间,与北京时间相差8小时
2. GetLocalTime(&locTm); //获取本时区时间。如中国即为东八区北京时间
3. CTime tm = CTime::GetCurrentTime(); //获取当前时间与1970年1月1日8am的秒数差
4. DWORD GetTickCount(void); //获取开机启动到此的毫秒数
那么,如何修改系统时间呢?
1. BOOL SetSystemTime(const SYSTEMTIME* lpSystemTime); //默认设置的为UTC时间,当系统按照参数设置时间的时候还会按照时区加上一个偏差。
SetSystemTime需要注意初始化SYSTEMTIME是不能忽略其成员变量wDayOfWeek,wMilliseconds(可以lpSystemTime->wDayOfWeek = -1;lpSystemTime->wMilliseconds = 0;),否则将返回0,不能成功设定本机时间。
2. BOOL SetLocalTime(const SYSTEMTIME* lpSystemTime); //设置本地系统时间
在设置时间的时候需要初始化SYSTEMTIME结构体:
SetLocalTime需要注意入参会忽略wDayOfWeek成员,可以不进行该成员的赋值(即使你赋值了也不会被考虑的),但其它所有成员都必须时行赋值,否则无法成功地进行时间设置。
3.上面说到的方法都是对日期/小时/分钟等每一项单独进行设置,在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"
b)dwFlags有三种值,LOCALE_NOUSEROVERRIDE、VAR_TIMEVALUEONLY、VAR_DATEVALUEONLY。 LOCALE_NOUSEROVERRIDE是使用系统默认的方式,VAR_TIMEVALUEONLY是忽略日期,在该选项下,日期会被设置为0,也就是1899年12月30日,在VAR_DATEVALUEONLY下忽略时间,时间被设置为0,即午夜零点。
c)至于第三个参数lcid,是指定转换方式,语言支持方面的,MSDN里面有个很详细的表,有兴趣可以去看看。
d)COleDateTime还提供了获取时间的函数,如GetYear()之类的。
e)注意一下,如果没有指定日期的话,转换后日期就自动变为0,也就是跑1899年去了,这可很危险啊!!
另外,这两个函数设置的时间,都是对本地机各个系统都有效的。本来很好奇windows系统下改了时间,linux下是不是也会跟着改呢。事实证明是这样的。
这两个函数在98下使用是正常的,但是在NT下会有权限问题,需要更改为管理员权限才能够修改时间。
修改系统时间权限代码:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, //注意,改的就是它
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
设置系统时间实例
bool i = false; // 设置时间是否成功标志位
char strctime[]="090111130111";// 初始化时间字符串
CString strTime ;
strTime.Insert(2,'-');strTime.Insert(5,'-');strTime.Insert(8,' ');strTime.Insert(11,':');strTime.Insert(14,':');COleDateTime tm ;SYSTEMTIME st;//GetLocalTime(&st);tm.ParseDateTime(strTime);tm.GetAsSystemTime(st);i= SetLocalTime(&st);strTime = strctime;
stopwatch 类
http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-3