博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
localtime 和 localtime_r
阅读量:6622 次
发布时间:2019-06-25

本文共 2728 字,大约阅读时间需要 9 分钟。

---恢复内容开始---

 

上程序:

[c-sharp]
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. #include <time.h>  
  4. #include <stdio.h>   
  5.   
  6. using namespace std;  
  7.   
  8. int main(int argc, char *argv[])  
  9. {  
  10.     time_t tNow =time(NULL);  
  11.     time_t tEnd = tNow + 1800;  
  12.     //注意下面两行的区别   
  13.     struct tm* ptm = localtime(&tNow);  
  14.     struct tm* ptmEnd = localtime(&tEnd);  
  15.   
  16.     char szTmp[50] = {0};  
  17.     strftime(szTmp,50,"%H:%M:%S",ptm);  
  18.     char szEnd[50] = {0};  
  19.     strftime(szEnd,50,"%H:%M:%S",ptmEnd);  
  20.       
  21.   
  22.     printf("%s /n",szTmp);  
  23.     printf("%s /n",szEnd);  
  24.       
  25.   
  26.     system("PAUSE");  
  27.     return EXIT_SUCCESS;  
  28. }  

#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; //注意下面两行的区别 struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S",ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S",ptmEnd); printf("%s /n",szTmp); printf("%s /n",szEnd); system("PAUSE"); return EXIT_SUCCESS; }

 

最后出来的结果是:

21:18:39

21:18:39

和最初想法不一致。

 

查阅localtime的文档,发现这段话:

This structure is statically allocated and shared by the functions gmtime and localtime. Each time either one of these functions is called the content of this structure is overwritten.

也就是说每次只能同时使用localtime()函数一次,要不就会被重写!

The localtime() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.

因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();

Unlike localtime(), the reentrant version is not required to set tzname。

 

修改程序:

[c-sharp]
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. #include <time.h>  
  4. #include <stdio.h>   
  5.   
  6. using namespace std;  
  7.   
  8. int main(int argc, char *argv[])  
  9. {  
  10.     time_t tNow =time(NULL);  
  11.     time_t tEnd = tNow + 1800;  
  12.   
  13.     //在这里修改程序   
  14.     //struct tm* ptm = localtime(&tNow);   
  15.     //struct tm* ptmEnd = localtime(&tEnd);   
  16.     struct tm ptm = { 0 };  
  17.     struct tm ptmEnd = { 0 };  
  18.     localtime_r(&tNow, &ptm);  
  19.     localtime_r(&tEnd, &ptmEnd);  
  20.       
  21.     char szTmp[50] = {0};  
  22.     strftime(szTmp,50,"%H:%M:%S",&ptm);  
  23.     char szEnd[50] = {0};  
  24.     strftime(szEnd,50,"%H:%M:%S",&ptmEnd);  
  25.     printf("%s /n",szTmp);  
  26.     printf("%s /n",szEnd);  
  27.       
  28.   
  29.     system("PAUSE");  
  30.     return EXIT_SUCCESS;  
  31. }  

#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; //在这里修改程序 //struct tm* ptm = localtime(&tNow); //struct tm* ptmEnd = localtime(&tEnd); struct tm ptm = { 0 }; struct tm ptmEnd = { 0 }; localtime_r(&tNow, &ptm); localtime_r(&tEnd, &ptmEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S",&ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S",&ptmEnd); printf("%s /n",szTmp); printf("%s /n",szEnd); system("PAUSE"); return EXIT_SUCCESS; }

 

最后出来的结果是:

10:29:06

10:59:06

 

---恢复内容结束---

转载地址:http://yijpo.baihongyu.com/

你可能感兴趣的文章
笔试面试题-寻找Coder
查看>>
Python文件读取常用方法
查看>>
day15-示例之后台管理左侧菜单
查看>>
Java类加载原理解析
查看>>
SQL Server 触发器
查看>>
Codeforces Round #387 (Div. 2) 747E
查看>>
比特币为什么需要建立在大量运算之上
查看>>
开源力量公开课第三十三期- 教你用Cocos2d-x开发跨平台移动应用
查看>>
二: 爬虫的数据解析的三种方式
查看>>
台北三日自助游攻略(转载)
查看>>
ansible命令详解
查看>>
Web API系列之二WebApi基础框架搭建
查看>>
ref
查看>>
团队冲刺第二天
查看>>
sed删除空行和开头的空格和tab键
查看>>
php扩展安装
查看>>
Windows与Linux之间的文件自动同步
查看>>
What a C programmer should know about memory
查看>>
java程序运行结果
查看>>
关于Mongodb
查看>>