头文件
:
#include <time.h>
关于时间的系统结构体
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 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
相关函数 API
生成时间函数 time
函数原型
:
time_t time(time_t *tloc);
描述
:
返回自纪元 Epoch
(
1970-01-01 00:00:00 UTC
)起经过的时间,以秒为单位。如果
tloc不为空,则返回值也存储在变量 tloc
中
参数
:
保存
自纪元
Epoch
(
1970-01-01 00:00:00 UTC
)起经过的时间值的指针,一般为NULL。
返回值:
自纪元 Epoch
(
1970-01-01 00:00:00 UTC
)起经过的时间,以秒为单位
备注:
无
计时函数 clock
函数原型
:
typedef long clock_t;
#define CLOCKS_PER_SEC ((clock_t)1000000)
clock_t clock(void)
描述
:
该函数可以返回从这个进程开始到调用这个函数的 CPU
时钟计时单元 (
clock tick)数,在
MSDN
中称之为挂钟时间(
wal-clock
)。
备注:
1.返回值是一个毫秒数,一般需要强转为浮点型然后除以
CLOCKS_PER_SEC
2.clock 是
CPU
线程计时的,所以程序中使用
sleep
函数
CPU
会停止计数,也就是计时最后不会算是 sleep
延时的时间。
使用实例
:
int main()
{
//printf("%ld\n",clock());
long int i = clock();
printf("%ld\n",i); //循环开始前的 CPU 计时
for(int z=0 ; z<100000000;z++);
long int j = clock();
printf("%ld\n",j);//循环结束时的计时
printf("%lf\n",(double)(j-i)/CLOCKS_PER_SEC); //计时循环持续了多少秒
return 0;
}
返回当地时间函数 ctime
函数原型
:
char *ctime(const time_t *timer)
描述:
返回一个表示当地时间的字符串,当地时间是基于参数 timer
。返回的字符串格式如下:Www Mmm dd hh:mm:ss yyyy
其中,
Www
表示星期几,
Mmm
是以字母表示的月份,dd
表示一月中的第几天,
hh:mm:ss
表示时间,
yyyy
表示年份。
参数
:
这是指向 time_t
对象的指针,该对象包含了一个日历时间。一般为保存
time
的返回值的指针。
返回值
:
该函数返回一个 C
字符串,该字符串包含了可读格式的日期和时间信息。
使用示例
:
int main()
{
time_t t;
time(&t);
printf("%s",ctime(&t));
return 0;
}
相差秒数函数 difftime
函数原型
:
double difftime(time_t time1, time_t time2)
描述
:
返回 time1
和
time2
之间相差的秒数
(time1 - time2)
。这两个时间是在日历时间中指定的,表示了自纪元 Epoch
(协调世界时
UTC
:
1970-01-01 00:00:00
)起经过的时间。
返回值:
该函数返回以双精度浮点型 double
值表示的两个时间之间相差的秒数
(time1 - time2)
使用示例
:
int main()
{
time_t start_t, end_t;
double diff_t;
printf("程序启动...\n");
time(&start_t);
printf("休眠 5 秒...\n");
sleep(5);
time(&end_t);
diff_t = difftime(end_t, start_t);
printf("执行时间 = %f\n", diff_t);
printf("程序退出...\n");
return(0);
}
结构体 tm 表示的时间函数 asctime
函数原型
:
char *asctime(const struct tm *timeptr)
描述
:
返回一个指向字符串的指针,它代表了结构 struct timeptr
的日期和时间
返回值:
该函数返回一个 C
字符串,包含了可读格式的日期和时间信息
Www Mmm dd hh:mm:ss yyyy,其中,
Www
表示星期几,
Mmm
是以字母表示的月份,
dd
表示一月中的第几天,hh:mm:ss 表示时间,
yyyy
表示年份。
示例
:
int main()
{
struct tm t;
t.tm_sec = 10;
t.tm_min = 10;
t.tm_hour = 6;
t.tm_mday = 25;
t.tm_mon = 2;
t.tm_year = 89;
t.tm_wday = 6;
puts(asctime(&t));
return(0);
}
计算世界标准时间函数 gmtime
函数原型
:
struct tm *gmtime(const time_t *timer)
描述
:
使用 timer
的值来填充
tm
结构,并用协调世界时(
UTC
)也被称为格林尼治标准时间(GMT
)表示。
使用示例
:
#define BST (+1)
#define CCT (+8)
int main ()
{
time_t rawtime;
struct tm *info;
time(&rawtime);
/* 获取 GMT 时间 */
info = gmtime(&rawtime );
printf("当前的世界时钟:\n");
printf("伦敦:%2d:%02d\n", (info->tm_hour+BST), info->tm_min);
printf("中国:%2d:%02d\n", (info->tm_hour+CCT), info->tm_min);
return(0);
}
本地时区的 tm 表示函数 localtime
函数原型
:
struct tm *localtime(const time_t *timer)
描述
:
使用 timer
的值来填充
tm
结构。
timer
的值被分解为
tm
结构,并用本地时区表示
使用示例
:
int main ()
{
time_t rawtime;
struct tm *info;
char buffer[80];
time( &rawtime );
info = localtime( &rawtime );
printf("当前的本地时间和日期:%s", asctime(info));
return(0);
}
结构体 tm 时间表示转换为 time_t 表示函数 mktime
函数原型
:
time_t mktime(struct tm *timeptr)
描述
:
把 timeptr
所指向的结构转换为自
1970
年
1
月
1
日以来持续时间的秒数,发生错误时返回-1
格式化时间输出函数 strftime
函数原型
:
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
描述
:
根据 format
中定义的格式化规则,格式化结构
timeptr
表示的时间,并把它存储在 str
中。
参数
:
str:
这是指向目标数组的指针,用来复制产生的
C
字符串
maxsize:
这是被复制到
str
的最大字符数
format:
这是
C
字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm
中所指定时间的相对应值。格式说明符如下表所示:
timeptr: 这是指向 tm 结构的指针
返回值
:
如果产生的 C
字符串小于
size
个字符(包括空结束字符),则会返回复制到
str
中的字符总数(不包括空结束字符),否则返回零
使用示例:
int main ()
{
time_t rawtime;
struct tm *info;
char buffer[80];
time( &rawtime );
info = localtime( &rawtime );
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
printf("格式化的日期 & 时间 : |%s|\n", buffer );
return(0);
}
微妙级时间获取函数 gettimeofday
头文件
:
#include <sys/time.h>
函数原型:
int gettimeofday(struct timeval *tv,struct timezone *tz )
描述:
Linux 下可以使用 gettimeofday()来查看当前时间,这个函数会计算从 1970 年 1 月 1 号 00:00(UTC)到当前的时间跨度。
使用函数 gettimeofday()函数可以得到精确时间。它的精度可以达到微妙。
参数
:
tv:timeval
结构体
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微妙*/
};
tz:timezone
结构体,一般填
NULL
就行,因为
linux
内核一般不会使用
struct timezone
{
int tz_minuteswest;/*和 greenwich 时间差了多少分钟*/
int tz_dsttime; /*type of DST correction*/
}
返回值:
成功返回 0
,失败返回
-1
备注
:
一般来说,我们使用 gettimeofday()
多是用来计算时间差,下面是计算时间差来计算微妙级计时。
使用示例:
const unsigned long Converter = 1000 * 1000; // 1s == 1000 * 1000 us
int main(void)
{
struct timeval val;
int ret = gettimeofday(&val, NULL);
sleep(2); // 睡眠 2s
struct timeval newVal;
ret = gettimeofday(&newVal, NULL);
printf("start: sec --- %ld, usec --- %ld\n", val.tv_sec,val.tv_usec);
printf("end: sec --- %ld, usec --- %ld\n", newVal.tv_sec,newVal.tv_usec);
unsigned long diff = (newVal.tv_sec * Converter + newVal.tv_usec) - (val.tv_sec * Converter + val.tv_usec);
printf("diff: sec --- %ld, usec --- %ld\n", diff /
Converter, diff % Converter);
return 0;
}
纳秒级时间获取函数 clock_gettime
头文件
:
#include <time.h>
函数原型:
int clock_gettime(clockid_t clk_id, struct timespec * tp);
描述:
函数"clock_gettime"
是基于
Linux C
语言的时间函数
,
他可以用于计算精度和纳秒
参数
:
clk_id:
时钟类型,
posix
标准定义了下面的四种基本类型,
Linux
系统有其他的扩充
CLOCK_REALTIME:系统实时时间,
随系统实时时间改变而改变
,
即从
UTC1970-1-1 0:0:0 开始计时,
中间时刻如果系统时间被用户改成其他
,
则对应的时间相应改变。
CLOCK_MONOTONIC:从系统启动这一刻起开始计时
,
不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统 CPU
花费的时间。需要注意
是不是进程开始到当前代码的时间。
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统 CPU
花费的时间。需要注意是不是线程开始到当前代码的时间。
tp:timespec
结构体,结构如下:
struct timespec
{
time_t tv_sec;//秒数
long tv_nsec;//纳秒
};
返回值:
成功返回 0
,失败返回
-1
示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
struct timespec time1 = {0};
clock_gettime(CLOCK_REALTIME, &time1);
printf("CLOCK_REALTIME: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
clock_gettime(CLOCK_MONOTONIC, &time1);
printf("CLOCK_MONOTONIC: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
sleep(5);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
printf("CLOCK_PROCESS_CPUTIME_ID: (%lu, %lu)\n",time1.tv_sec, time1.tv_nsec);
sleep(5);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time1);
printf("CLOCK_THREAD_CPUTIME_ID: (%lu, %lu)\n", time1.tv_sec,time1.tv_nsec);
printf("now time :%lu\n", time(NULL));
return 0;
}
延时操作
秒延时函数 sleep
头文件
:
#include <unistd.h>
函数原型:
unsigned int sleep(unsigned int seconds);
描述:
执行挂起一段时间,也就是等待一段时间在继续执行
参数
:
seconds:
延时时间
返回值
:
成功则返回 0
,如果延时过程中被打断,则返回剩余的秒数
。
备注
:
延时单位秒
微秒延时函数 usleep
头文件
:
#include <unistd.h>
函数原型:
int usleep(useconds_t usec);
描述:
执行挂起一段时间,也就是等待一段时间在继续执行
参数
:
usec:
延时时间
返回值
:
成功则返回 0
,失败返回
-1
备注
:
延时单位微秒,
1000,000
微妙
=1
秒
纳秒延时函数 ndelay
头文件
:
#include <linux/delay.h>
函数原型:
void ndelay(unsigned long nsecs);
描述:
执行挂起一段时间,也就是等待一段时间在继续执行
参数
:
nsecs:
延时时间
返回值
:
无
备注
:
延时单位纳秒,
1000,000,000
纳妙
=1
秒,一些系统可能不会支持此函数头文件