主要作用
都是将std::time_t类型数据转换为 std::tm类型
代码示例:
// localtime示例
// 使用high_resolution_clock获取当前时间点
auto now = std::chrono::system_clock::now();
// 转换为time_t格式,便于转换为本地时间
std::time_t time_now = std::chrono::system_clock::to_time_t(now);
std::cout<<std::put_time(std::localtime(&time_now),"%Y%m%d")<<std::endl;
// localtime_s示例
// 使用high_resolution_clock获取当前时间点
auto now = std::chrono::system_clock::now();
std::tm tm;
if(localtime_s(&tm, &time_now) != 0)
{
std::cout<<"error"<<std::endl;
return;
}else {
// 输出本地时间
std::cout << "当前本地时间为: " << std::asctime(&tm);
}
std::cout<< "localtime_s:: "<<std::put_time(&tm, "%Y%m%d") <<std::endl;
函数原型
// localtime 函数原型
struct tm* localtime(const time_t* timeptr);
// localtime_s 函数原型
errno_t localtime_s(struct tm *_Pt, const time_t *_Time);
两者的区别
localtime函数是线程不安全的,而localtime_s是微软提供的线程安全版本的localtime。
在具体功能上,两者没有区别,都是将time_t类型变量转化为 tm 类型。
localtime_s能够避免缓冲区溢出风险,因为函数需要使用者提供一个指向tm结构体的指针,这个结构体是用户自己分配的,所以能够知道它的来源,不会被其他代码覆盖。
注意事项
localtime_s
函数返回 errno_t
类型的值,如果函数成功,则返回 0
;如果发生错误,则返回一个非零值,并且可以设置全局变量 errno
来指示错误的原因。因此,在调用 localtime_s
后检查返回值是很重要的。
本笔记记录原因
在使用localtime函数时,vs报错。
报错内容:
错误 C4996 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.