C++使用localtime函数需要注意的地方

在处理时间时用到了localtime这个函数,将一个UTC时间转为本地时间:

#include <time.h>
time_t tmNow = time(NULL);
tm *ptmNow = localtime(&tmNow);  //从tm结构体中可以取到年月日时分秒等值。

这里localtime返回了一个tm指针,空间是由localtime自己控制的,所以如果 连续调用这个函数会有问题

很多时候我们会同时处理两个时间,例如表示时间段的【起始时间】【结束时间】,代码如下:

time_t tmBegin = 1351118531;	//2012-10-25 06:42:11
time_t tmEnd = 1351218731;		//2012-10-26 10:32:11
tm* ptmBegin = localtime(&tmBegin );
tm* ptmEnd = localtime(&tmEnd );//第二次调用会修改上次调用的tm结构体,若上次的数据未保存则会丢失
//tm* ptm3 = gmtime(&tmEnd );		//效果同上条语句,也会重写之前的数据
char ctmBegin1[26], ctmEnd[26];
strftime(ctmBegin, 26, "%Y%m%d%H%M%S", ptmBegin);	//这里输出的将是tmEnd的时间值
strftime(ctmEnd, 26, "%Y%m%d%H%M%S", ptmEnd);
  
/*MSDN中有相关说明:
  	Both the 32-bit and 64-bit versions ofgmtime, mktime, mkgmtime, and localtimeall 
use a single tm structure per thread for the conversion. Each call to one of these 
routines destroys the result of the previous call. 
*/
所以要记住,一旦调用了localtime函数,应该 马上取出tm结构中的内容:

time_t tmBegin = 1351118531;		//2012-10-25 06:42:11
time_t tmEnd = 1351218731;		//2012-10-26 10:32:11
char ctmBegin1[26], ctmEnd[26];
tm* ptmBegin = localtime(&tmBegin );
strftime(ctmBegin, 26, "%Y%m%d%H%M%S", ptmBegin);
tm* ptmEnd = localtime(&tmEnd );	
strftime(ctmEnd, 26, "%Y%m%d%H%M%S", ptmEnd);
//tm* ptm3 = gmtime(&tmEnd );



                
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
所有的 C / C++ 函数 Constructors (cppstring) Constructors (cppvector) Operators (cppbitset) Operators (cppdeque) Operators (cppstack) Operators (cppstring) Operators (cppvector) abort (stdother) abs (stdmath) acos (stdmath) any (cppbitset) append (cppstring) asctime (stddate) asin (stdmath) assert (stdother) assign (cppdeque) assign (cpplist) assign (cppstring) assign (cppvector) at (cppdeque) at (cppstring) at (cppvector) atan (stdmath) atan2 (stdmath) atexit (stdother) atof (stdstring) atoi (stdstring) atol (stdstring) back (cppdeque) back (cpplist) back (cppqueue) back (cppvector) bad (cppio) begin (cppdeque) begin (cpplist) begin (cppmap) begin (cppmultimap) begin (cppmultiset) begin (cppset) begin (cppstring) begin (cppvector) bsearch (stdother) c_str (cppstring) calloc (stdmem) capacity (cppstring) capacity (cppvector) ceil (stdmath) clear (cppdeque) clear (cppio) clear (cpplist) clear (cppmap) clear (cppmultimap) clear (cppmultiset) clear (cppset) clear (cppvector) clearerr (stdio) clock (stddate) compare (cppstring) copy (cppstring) cos (stdmath) cosh (stdmath) count (cppbitset) count (cppmap) count (cppmultimap) count (cppmultiset) count (cppset) ctime (stddate) data (cppstring) #define (preproc) difftime (stddate) div (stdmath) empty (cppdeque) empty (cpplist) empty (cppmap) empty (cppmultimap) empty (cppmultiset) empty (cpppriorityqueue) empty (cppqueue) empty (cppset) empty (cppstack) empty (cppstring) empty (cppvector) end (cppdeque) end (cpplist) end (cppmap) end (cppmultimap) end (cppmultiset) end (cppset) end (cppstring) end (cppvector) eof (cppio) equal_range (cppmap) equal_range (cppmultimap) equal_range (cppmultiset) equal_range (cppset) erase (cppdeque) erase (cpplist) erase (cppmap) erase (cppmultimap) erase (cppmultiset) erase (cppset) erase (cppstring) erase (cppvector) #error (preproc) exit (stdother) exp (stdmath) fabs (stdmath) fail (cppio)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值