vs2013写c++程序,其中localtime_s函数不接受一个参数怎么解决?!
Visual C++ 6.0开发环境中显示当地日期与时间主要通过localtime()函数来实现,该函数的原型在time.h头文件中,其语法格式如下:struct tm *localtime(xonst time_t *timer)该函数的作用是把timer所指的时间(如函数time返回的时间)转换为当地标准时间,并以tm结构形式返回。其中,参数timer为主要获取当前时间的传递参数,格式为time_t指针类型。而在Visual Studio 2010及其以后的版本,新增了安全函数,改成localtime_s(),语法格式也发生了变化:errno_t localtime_s( struct tm* _tm, const time_t *time );其中:_tm指向要填充的时间结构的指针。time指针,指向存储的时间。如果成功,返回值则为零。 如果失败,返回值将是错误代码。 错误代码是在 Errno.h 中定义的。结构类型的字段 tm 存储下面的值,其中每个为 int。tm_sec分钟后的几秒 (0-59)。tm_min小时后的分钟 (0-59)。tm_hour午夜后经过的小时 (0-23)。tm_mday月 (1-31) 天。tm_mon月 (0 – 11;年 1 月 = 0)。tm_year年份 (当前年份减去 1900年)。tm_wday星期几 (0 – 6;星期日 = 0)。tm_yday每年的一天 (0-365;1 月 1 日 = 0)。tm_isdst如果夏令时有效,则为,正值夏时制不起作用; 如果为 0如果夏时制的状态是未知的负值。 如果 TZ 设置环境变量,C 运行库会假定规则适用于美国境内用于实现夏令时 (DST) 计算。下面以一个Visual Studio 2015实例来输出当地日期与时间:#include #include using namespace std;int main(void){ struct tm t; //tm结构指针 time_t now; //声明time_t类型变量 time(&now); //获取系统日期和时间 localtime_s(&t, &now); //获取当地日期和时间 //格式化输出本地时间 printf("年:%d\n", t.tm_year + 1900); printf("月:%d\n", t.tm_mon + 1); printf("日:%d\n", t.tm_mday); printf("周:%d\n", t.tm_wday); printf("一年中的第%d天\n", t.tm_yday); printf("时:%d\n", t.tm_hour); printf("分:%d\n", t.tm_min); printf("秒:%d\n", t.tm_sec); printf("夏令时:%d\n", t.tm_isdst); system("pause"); return 0;}
为什么localtime函数是线程不安全的
从localtime函数的原型定义分析
struct tm *localtime(const time_t *timep);
localtime函数返回了一个struct tm指针,函数的说明中并未要求调用者将该指针free掉,证明tm对象并非是malloc或new出来的。那么tm一定是个全局变量或者是localtime函数中的局部静态变量。
这样的变量在多线程访问时会出问题,第一个线程在localtime返回之前首先改变了这个变量的值,第二个线程又进来改变这个变量,以此类推。这样第一个线程在真正返回时该值已经被多次改变,这是典型的函数重入问题。
因此localtime函数线程不安全。
C语言关于localtime_s()和asctime_s()两个函数的用法。
1、localtime函数:原型:struct tm * localtime(const time_t * clock);功能:把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间, 其中clock为秒数时间;返回值:返回一个tm结构体的指针。tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体。2、asctime函数:原型:char* asctime (const struct tm * timeptr);功能:把timeptr指向的tm结构体中储存的时间转换为字符串;返回值:一个固定格式的字符串。字符串格式为:Www Mmm dd hh:mm:ss yyyy。其中Www为星期,Mmm为月份,dd为日,hh为时,mm为分,ss为秒,yyyy为年份;3、例程:#include#includeint main(){ time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime);//使用localtime函数把秒数时间rawtime转换为本地时间以tm结构体保存,并把tm结构体地址储存到timeinfo当中 printf("当前日期为: %s",asctime(timeinfo));//使用asctime函数把tm结构体中储存的时间转换为字符串,并输出 return 0;}