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函数,需要显示调用该函数获取时区信息。