localtime与localtime_r作用与区别

localtime函数

函数声明:

struct tm *localtime(const time_t *timer);

函数作用:将传入的时间秒数(从1970.1.1 00:00:00开始的一个秒数)转换为本地日历时间,并将结果存储在一个全局静态变量中,并返回该全局变量的地址。
注意点:
1.多线程场景下,两个线程同时调用localtime转换时间,最终获取的时间相同,且以最后一个函数调用转换时间为准。
2.单线程场景下,多次调用localtime转换时间,并用两个局部变量去保存转换时间结果,最终两个临时变量结果一致,且为最后一个localtime转换结果。

#include <iostream>
#include <time.h>
using namespace std;
int main()
{
    time_t t1 = 1234567892;
    struct tm* myTm1 = localtime(&t1);
    printf("time1 is : %04d%02d%02d%02d%02d%02d\n",
              myTm1->tm_year + 1900,
              myTm1->tm_mon + 1,
              myTm1->tm_mday,
              myTm1->tm_hour,
              myTm1->tm_min,
              myTm1->tm_sec);
    time_t t2 = time(NULL);
    struct tm* myTm2 = localtime(&t2);
    printf("time2 is : %04d%02d%02d%02d%02d%02d\n",
           myTm2->tm_year + 1900,
           myTm2->tm_mon + 1,
           myTm2->tm_mday,
           myTm2->tm_hour,
           myTm2->tm_min,
           myTm2->tm_sec);
    printf("time1 is : %04d%02d%02d%02d%02d%02d\n",
           myTm1->tm_year + 1900,
           myTm1->tm_mon + 1,
           myTm1->tm_mday,
           myTm1->tm_hour,
           myTm1->tm_min,
           myTm1->tm_sec);
    return 0;
}

//结果:
//time1 is : 20090214073132
//time2 is : 20231120120622
//time1 is : 20231120120622
localtime_r函数

函数声明:

struct tm *localtime_r(const time_t *timer, struct tm *buf);

作用:
将传入参数timer表示的秒数转换为日历时间格式,保存结果在buf,同时也会保存结果一个全局静态变量中,返回这全局静态变量的指针。
注意:
1.localtime_r函数通过传入tm参数指针保存转换结果,使localtime_r函数线程安全。
2.如果使用localtime_r函数返回值表示日历,仍然是线程不安全的,通常仅通过返回值是否为空,判断localtime_r函数转换时间是否成功。
示例:

#include <iostream>
#include "TestStringBuffer.h"
#include "TestDocumentAndValueJson.h"
#include <time.h>
#include <cstring>

using namespace std;
int main()
{
    struct tm targetTm;
    time_t t1 = 1234567892;
    tzset();
    struct tm* myTm1 = localtime_r(&t1, &targetTm);
    printf("time1 is : %04d%02d%02d%02d%02d%02d\n",
              myTm1->tm_year + 1900,
              myTm1->tm_mon + 1,
              myTm1->tm_mday,
              myTm1->tm_hour,
              myTm1->tm_min,
              myTm1->tm_sec);
    printf("targetTm is : %04d%02d%02d%02d%02d%02d\n",
           targetTm.tm_year + 1900,
           targetTm.tm_mon + 1,
           targetTm.tm_mday,
           targetTm.tm_hour,
           targetTm.tm_min,
           targetTm.tm_sec);
    time_t t2 = time(NULL);
    struct tm* myTm2 = localtime_r(&t2, &targetTm);
    printf("time2 is : %04d%02d%02d%02d%02d%02d\n",
           myTm2->tm_year + 1900,
           myTm2->tm_mon + 1,
           myTm2->tm_mday,
           myTm2->tm_hour,
           myTm2->tm_min,
           myTm2->tm_sec);
    printf("time1 is : %04d%02d%02d%02d%02d%02d\n",
           myTm1->tm_year + 1900,
           myTm1->tm_mon + 1,
           myTm1->tm_mday,
           myTm1->tm_hour,
           myTm1->tm_min,
           myTm1->tm_sec);
    printf("targetTm is : %04d%02d%02d%02d%02d%02d\n",
           targetTm.tm_year + 1900,
           targetTm.tm_mon + 1,
           targetTm.tm_mday,
           targetTm.tm_hour,
           targetTm.tm_min,
           targetTm.tm_sec);
    return 0;
}

//结果:
//time1 is : 20090214073132
//targetTm is : 20090214073132
//time2 is : 20231120120622
//time1 is : 20231120120622
//targetTm is : 20231120120622

代码示例差异说明:localtime集成了tzset函数,无须显示调用tzset函数;localtime_r未集成tzset函数,需要显示调用该函数获取时区信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值