zoukankan      html  css  js  c++  java
  • localtime 和 localtime_r 的区别

    转自:http://blog.csdn.net/maocl1983/article/details/6221810
    #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。  修改程序:
    #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  
  • 相关阅读:
    C# Process执行bat
    Auto Clear Unity Console Log
    Unity原厂讲师大解密
    setSystemUiVisibility() 与 getSystemUiVisibility() 显示隐藏状态栏
    Android 6.0 动态权限申请
    Android6.0动态权限申请步骤以及需要注意的一些坑
    基于Rebound制造绚丽的动画效果-入门篇
    Rebound-Android的弹簧动画库
    Rebound动画框架简单介绍
    让动画不再僵硬:Facebook Rebound Android动画库介绍
  • 原文地址:https://www.cnblogs.com/zendu/p/4991078.html
Copyright © 2011-2022 走看看