VS2013中出现:
This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
查阅后使用了
errno_t localtime_s(
struct tm* _tm,
const time_t *time
);
errno_t _localtime32_s(
struct tm* _tm,
const time32_t *time
);
errno_t _localtime64_s(
struct tm* _tm,
const _time64_t *time
);
在处理时间时用到了localtime这个函数,将一个UTC时间转为本地时间:
这里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.
- */
- 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 );