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  
  • 相关阅读:
    scrapy练习1
    sys.path.append()加入当前目录为环境变量
    同济:003.映射与函数3
    1-4 无监督学习(Unsupervised Learning)
    1-3.监督学习(supervised learning)
    同济:002.映射与函数2
    github访问过慢解决
    LeetCode OJ:Contains Duplicate(是否包含重复)
    LeetCode OJ:Maximum Product Subarray(子数组最大乘积)
    LeetCode OJ:Valid Anagram(有效字谜问题)
  • 原文地址:https://www.cnblogs.com/zendu/p/4991078.html
Copyright © 2011-2022 走看看