c++中的时间处理(1)localtime、localtime_r和localtime_s

c++中对时间的处理有好几个函数,很多C++程序员可能用过,但不一定完全搞得清楚。这里,我先讲解下:localtime、localtime_r和localtime_s的使用

1、localtime

localtime用来获取系统时间,精度为秒。

struct tm *localtime(const time_t * timep)

其中,struct tm的结构如下:

#ifndef _TM_DEFINED
struct tm {
          int tm_sec;       /* 秒 – 取值区间为[0,59] */
          int tm_min;       /* 分 - 取值区间为[0,59] */
          int tm_hour;      /* 时 - 取值区间为[0,23] */
          int tm_mday;      /* 一个月中的日期 - 取值区间为[1,31] */
          int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
          int tm_year;      /* 年份,其值等于实际年份减去1900 */
          int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
          int tm_yday;      /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
          int tm_isdst;     /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
          };
#define _TM_DEFINED
#endif

例子:

#include <stdio.h>
#include <time.h>
 
int main()
{
    time_t time_seconds = time(0);
    struct tm* now_time = localtime(&time_seconds);
 
    printf("%d-%d-%d %d:%d:%d\n", now_time->tm_year + 1900, now_time->tm_mon + 1,
        now_time->tm_mday, now_time->tm_hour, now_time->tm_min,
        now_time->tm_sec);
}

执行结果:

2、localtime_r

localtime_r也是用来获取系统时间,运行于linux平台下。

函数原型如下:

struct tm *localtime_r(const time_t *timep, struct tm *result);

执行结果:

3、localtime_s

在windows下使用localtime函数时,如果打开"SDL检查"会报错:

 错误信息:

因为localtime并不是线程安全的,localtime在使用时,我们只需定义一个指针,并不需要为指针申请空间;而指针必须要指向内存空间才可以使用,其实申请空间的动作由函数自己完成,这样在多线程的情况下,如果有另一个线程调用了这个函数,那么指针指向的struct tm结构体的数据就会改变。
下面我们来看一个使用localtime_s的例子:

#include <iostream>
#include <time.h>
 
int main()
{
	time_t time_seconds = time(0);
	struct tm now_time;
	localtime_s(&now_time,&time_seconds);
 
	printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,
		now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
}

猜你喜欢

转载自blog.csdn.net/mars21/article/details/131663543