关于time.h,有人总结了这么3句话:
(1)time_t:表示距离 UTC 时间 1970-01-01 00:00:00 的秒数。也叫做日历时,类型是 long
(2)clock_t: 只用于程序计时,貌似其他的没它什么事。
(3)struct tm:通常用于存储本地时。
其中的常用函数:
(1)clock: 获取程序开始执行后占用的处理器时间,返回值clock_t。
(2)time: 获取当前系统时间(UTC时间)的time_t值。
(3)ctime: 将time_t值转换为表示本地时间的字符串。
(4)asctime: 将struct tm转换为字符串形式。
(5)localtime:将time_t转换为表示本地时间的strunct tm结构。
(6)gmttime: 将time_t值转换为表示GMT时间的字符串。
(7)mktime: 将表示本地时间的struct tm转换为time_t。
(8)strftime: 自定义把结构体tm的日期与时间信息转换为制定的格式。
(9)difftime: 得到两个日历时之间的差值。
1、clock
例子:
#include <stdio.h>
#include <time.h>
// 定义记录开始和结束时间的变量
clock_t start, stop;
// 记录函数运行时间, 单位为秒
double duration;
int main(){
start=clock();
MyFunction();//要进行计时的目标函数.
// 记录自 main() 函数被执行开始到本次 clock() 被调用一共走过了多少个 ticks.
stop=clock();
// 将时钟打点数转换成秒数
duration=((double)(stop-start))/CLOCKS_PER_SEC;
return 0;
}
2、time
1970-01-01 00:00:00 +0000 (UTC).)到现在的时间值,用秒表示。
常见用法:
time_t time_seconds = time(0);
3、ctime
ctime()用来把时间数值转换成:Tue Jul 11 21:22:42 2023? 这种格式的字符串。
ctime()的函数原型如下:
char *ctime(const time_t *timep);
跟ctime()还是功能类似的函数还有下面2个(类似localtime有localtime_r, localtime_s):
char *ctime_r(const time_t *timep, char *buf);
errno_t ctime_s(char *buf, rsize_t bufsz, const time_t* timer);
举例:
#include <stdio.h>
#include <time.h>
#include <string.h>
int main()
{
time_t now = time(0);
printf("%s\n", ctime(&now));
char buf[32];
memset(buf, 0, sizeof(buf));
ctime_r(&now, buf);
printf("%s\n", buf);
}
4、asctime
函数原型:
char* asctime(struct tm * ptr)
举例:
#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{
struct tm t;
char str[80];
t.tm_sec = 1;
t.tm_min = 3;
t.tm_hour = 7;
t.tm_mday = 22;
t.tm_mon = 11;
t.tm_year = 56;
t.tm_wday = 4;
t.tm_yday = 0;
t.tm_isdst = 0;
strcpy(str, asctime(&t));
printf("%s", str);
return 0;
}
5、localtime(前面的文章详细讲述了localtime, localtime_r, localtime_s)
6、gmtime
gmtime的用法与localtime是一样的,两者不同之处在于,gmtime的话是UTC时间,而localtime的话是本地时间。
gmtime的函数原型:
struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);
举例:
#include <stdio.h>
#include <time.h>
int main()
{
time_t time_seconds = time(0);
struct tm now_time;
localtime_r(&time_seconds, &now_time);
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);
gmtime_r(&time_seconds, &now_time);
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);
}
结果:
可以看到,gmttime返回的时间比localtime迟8个小时。
7、mktime
localtime, gmtime把time_t转成tm,mktime的作用刚好相反,把tm转成time_t。
mktime的函数原型:
time_t mktime(struct tm *tm);
举例:
time_t t = time(0);
struct tm p;
localtime_s(&p, &t);
printf("本地时间:%d年%d月%d日 %d:%d:%d\n",
p.tm_year + 1900, p.tm_mon + 1, p.tm_mday,
p.tm_hour, p.tm_min, p.tm_sec);
time_t mkt = -1;
mkt = mktime(&p);
if (-1 == mkt){
perror("mktime");
}else{
printf("%ld second\n", mkt);
}
8、strftime
用来格式化输出时间,比如按:"%Y%m%d %H:%M:%S" 格式输出,函数原型如下:
size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
举例:
char buf[32];
memset(buf, 0, sizeof(buf));
strftime(buf, sizeof(buf), "%y-%m-%d, %H:%M:%S", &p);
printf("%s\n", buf);
9、difftime
函数原型:
double difftime(time_t time2, time_t time1);
举例:
time_t first, second;
first = time(0);
Sleep(5000);
second = time(0);
std::cout << std::to_string(difftime(second, first)) << std::endl;
return 0;
10、gettimeofday
gettimeofday的话可以获得微秒以及时区以及夏令时等信息。记得它要包含有 #include <sys/time.h> 这个头文件的时候才可以用struct timeval 和struct timezone这两个类型。
举例:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
struct timeval tv = {0};
struct timezone tz = {0} ;
int ret = -1;
ret = gettimeofday(&tv,&tz);
if (-1 == ret )
{
perror("gettimeofday");
return -1;
}
printf("U-SECOND = %ld\n",tv.tv_usec);
printf("TIMEZONE = %d\n",tz.tz_minuteswest);
printf("TIMEZONE = %d\n",tz.tz_dsttime);
}
参考:
(1)C++ time.h 库详解
(2)struct tm 和 time_t 时间和日期的使用方法