• 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  
  • 相关阅读:
    WPF:DataGrid 自动生成行号
    C#:WinForm之Command
    i.MX RT1010之FlexIO模拟SSI外设
    i.MX RT1010之FlexIO模拟I2S外设
    i.MX RT600之DSP开发环境调试篇
    i.MX RT600之DSP调试环境搭建篇
    i.MX RT600之DMIC外设介绍及应用
    i.MX RT600之I2S外设介绍及应用
    ssm框架思维-登录
    idea里面搭建SSM框架-crud
  • 原文地址:https://www.cnblogs.com/zendu/p/4991078.html
Copyright © 2020-2023  润新知