VC中关于时间获取及修改的方法

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 = strctime;  
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);




stopwatch 类 

http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-3
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值