在一些应用的编写中我们有时候需要用到时间,或者需要一个“锚点”来确定一些数的值。在c/c 中有两个用来确定时间的函数:time/gettimeofday
一、time
代码语言:javascript复制time_t time(time_t *timer);
time
函数返回当前时间的时间戳(自 1970 年 1 月 1 日以来经过的秒数)。timer
参数是一个指向time_t
类型变量的指针,用于存储获取的时间戳。如果传递NULL
,则表示不需要返回时间戳。- 在 C 语言中,
time
函数用于获取当前的系统时间,以秒为单位,返回自 1970 年 1 月 1 日以来经过的秒数(即 Unix 时间戳)。 - 在 C 语言中,
time
函数同样用于获取当前的系统时间,但返回类型是time_t
类型的值,表示从 1970 年 1 月 1 日以来经过的秒数。 - 使用
time
函数只需要包含<time.h>
头文件
#include <stdio.h>
#include <time.h>
int main() {
// 声明一个变量用于存储时间戳
time_t current_time;
// 使用 time 函数获取当前时间戳
time(¤t_time);
// 打印获取的时间戳
printf("Current timestamp: %ldn", current_time);
return 0;
}
当我们获取到这个time_t类型的数据时其实如果像转换成年份秒的话还是有一些麻烦,所以系统提供了一个叫作localtime的函数
1.2localtime
localtime
函数用于将时间戳转换为本地时间。它接受一个指向 time_t
类型的时间戳的指针,并返回一个指向 struct tm
结构体的指针,该结构体包含了转换后的本地时间信息。
struct tm *localtime(const time_t *timer);
timer
是一个指向time_t
类型的时间戳的指针,表示要转换的时间。- 返回值是一个指向
struct tm
结构体的指针,包含了转换后的本地时间信息。
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, 11]
int tm_year; // 年 - 1900
int tm_wday; // 一周中的日 [0, 6],0 表示星期天
int tm_yday; // 一年中的日 [0, 365]
int tm_isdst; // 夏令时标志:正值表示夏令时,零值表示不确定,负值表示不是夏令时
};
值得注意的是该在早期的 C 语言标准中,为了节省内存空间,结构体 struct tm
中的 tm_year
成员被设计为表示自 1900 年起的年数。这种设计主要是出于历史考虑和对早期计算机内存资源的限制。确实和time的1970不同,这种做法确实增加了一些不便,但在当时的环境下,这种设计被认为是合理的。
所以他的用例如下
代码语言:javascript复制#include <stdio.h>
#include <time.h>
int main() {
// 获取当前时间戳
time_t current_time;
time(¤t_time);
// 使用 localtime 函数将时间戳转换为本地时间
struct tm *local_time = localtime(¤t_time);
// 打印转换后的本地时间信息
printf("Local time: %d-d-d d:d:dn",
local_time->tm_year 1900, local_time->tm_mon 1, local_time->tm_mday,
local_time->tm_hour, local_time->tm_min, local_time->tm_sec);
return 0;
}
二、gettimeofday
代码语言:javascript复制int gettimeofday(struct timeval *tv, struct timezone *tz);
gettimeofday
函数获取当前时间,并将其存储在struct timeval
结构体中。tv
参数是一个指向struct timeval
结构体的指针,用于存储获取的时间信息。tz
参数是一个指向struct timezone
结构体的指针,用于存储时区信息。在实际使用中通常传递NULL
,表示不需要获取时区信息。
struct timeval
结构体的定义如下:
struct timeval {
time_t tv_sec; // 秒数
suseconds_t tv_usec; // 微秒数
};
struct timezone {
int tz_minuteswest; // 格林尼治时间西部时区和当前时区的分钟差值
int tz_dsttime; // DST(夏令时)是否生效
};
gettimeofday
函数提供了更高精度的时间信息,适用于需要更精确计时的场景。- 在 C 语言中,需要包含
<sys/time.h>
头文件,并且需要额外定义struct timeval
结构体。 - 在 C 语言中,同样需要包含
<sys/time.h>
头文件,并且使用struct timeval
结构体来存储时间信息。