目录

1.静态打印系统时间

1.要了解的知识

1.1 time_t 类型

1.1.2struct tm 类型

1.1.3 time()函数

1.2显示系统时间函数

1.2.1 localtime()函数—显示当前时区的时间

1.2.2 ctime()函数—以特定方式显示当前时间信息

1.2.3 asctime()函数—将包含当前日期时间信息的tm*类型的数据以字符串形式打印

1.2.4gmtime()函数—显示格林威治标准时间

1.2.5 mktime()函数—将tm*类型的指针转化为一个时间戳【秒数】

2.计算程序运行的时间

2.1预备知识点

2.1.1 clock_t 类型

2.1.2 clock()函数

2.1.3 CLOCKS_PER_SEC

2.2计算程序运行的时间

3.动态打印系统的时间

3.1利用Sleep延时函数

3.2C语言定时器方式


1.静态打印系统时间

如果要实现静态打印系统时间的效果,首先来认识几个时间类型和时间函数

在后续的实时显示系统时间也会用到该部分的一些知识

1.要了解的知识

1.1 time_t 类型

time_t 类型是最基本的时间类型

本质是无符号长整型(unsigned long),适合用来存储与显示时间相关的变量

1.1.2struct tm 类型

是一个结构体类型,成员变量用来存储年、月、日、时、分、秒

struct tm{    int tm_sec;   // 秒,范围0-60    int tm_min;   // 分,范围0-59    int tm_hour;  // 时,范围0-23    int tm_mday;  // 日,范围1-31    int tm_mon;   // 月,范围0-11,使用时需+1处理    int tm_year;  // 年,使用时需+1970    int tm_wday;  // 周,范围0-6,使用时需+1    int tm_yday;  // 从1月1日起,今天是今年的第几天    int tm_isdst; // daylight savings time flag---夏令时标志,判断日历时间是否是夏令时时间};

例如:使用localtime函数可以得到一个指向tm类型的tm*型的指针,该指针指向的数据包含了当前时间的一些数据,包括年月日等

1.1.3 time()函数

函数原型:time_t time(time_t* timer) //获取时间戳【也就是秒数】

使用方法:传一个time_t指针 类型的参数进去,返回一个time_t的返回值

如果传空指针进去,返回的数值是从1970年1月1日 00:00:00秒 截止到程序运行时经过的秒数

如果不传空指针进去,举例

time_t start;

time(&start); //time函数的返回值就存到start里面了

    time_t timer0;timer0= time(NULL);printf("%lld\n", timer0);    return 0;

1.2显示系统时间函数

1.2.1 localtime()函数—显示当前时区的时间

函数原型:struct tm* localtime(const time_t* timer) //将时间戳转化为当地时区的时间

使用方法:传进去一个time_t指针类型的参数,返回一个与此参数对应的时间结构体struct tm*的指针。const是用来修饰参数指针不被修改;

通俗点就是:使用time()函数,可以返回一个时间戳【秒数】,定义一个time_t指针类型的变量ptimer指向这个时间戳,将ptimer作为参数传进localtime()函数,可以得到一个tm*类型的指针plocaltime,plocaltime指向的数据包括了当地时区的时间信息,包括年月日时分秒等;

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){time_t timer0;timer0= time(NULL);printf("%lld\n", timer0);struct tm* plocaltime = localtime(&timer0);printf("\n%d-%d-%d", plocaltime->tm_year + 1900, plocaltime->tm_mon + 1, plocaltime->tm_mday);printf(" %d:%d:%d\n",plocaltime->tm_hour,plocaltime->tm_min,plocaltime->tm_sec);    return 0;}

简而言之:将时间戳转化为当地的日历时间

1.2.2 ctime()函数—以特定方式显示当前时间信息

函数原型:char* ctime(time_t* timer); //将时间戳转化为一个表示当前日期时间的字符串

使用方法:将time函数返回值-时间戳【秒数】作为参数传递给ctime函数,返回一个指向以特定方式表示当前日期时间的字符串的字符串指针,然后将字符串打印出来即可

特定的打印格式为:周 月 日 时 分 秒 年

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){time_t timer0;timer0= time(NULL);char* pctime = ctime(&timer0);printf("\n%s\n", pctime);    return 0;}

1.2.3 asctime()函数—将包含当前日期时间信息的tm*类型的数据以字符串形式打印

函数原型:char* asctime(struct tm* ptime)

使用方式:使用time()函数获取时间戳timer0,再使用localtime()函数将此时间戳转化为一个指向的包含当地时区时间信息的tm*类型的指针plocaltime,将此指针传递给asctime函数,以字符串的形式打印其包含的时间信息;

字符串的格式与ctime函数打印的格式相同;

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){time_t timer0;timer0= time(NULL);struct tm* plocaltime = localtime(&timer0);    char* pasctime = asctime(plocaltime);    printf("\n%s\n", pasctime);    return 0;}

1.2.4gmtime()函数—显示格林威治标准时间

localtime函数和ctime函数得到的都是当地时区的时间

而gmtime函数得到的是格林威治标准时间【UTC】

函数原型:struct tm* gmtime(time_t* timer); //得到UTC时间

函数使用:函数使用几乎与localtime函数一模一样,只是函数名不同;

1.2.5 mktime()函数—将tm*类型的指针转化为一个时间戳【秒数】

这个函数的作用与我们的目标正好相反,它是将指向包含当前时区时间信息的tm*类型的指针转化为是时间戳,与localtime函数的作用正好相反

函数原型:time_t mktime(struct tm* ptime); //得到/返回一个包含当地时区信息的时间戳

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){time_t timer0;timer0= time(NULL);printf("%lld\n", timer0);struct tm* plocaltime = localtime(&timer0);    time_t time1;    time1 = mktime(plocaltime);    printf("\n%lld\n", time1);    return 0;}

以上函数使用汇总:

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){time_t timer0;timer0= time(NULL);printf("%lld\n", timer0);struct tm* plocaltime = gmtime(&timer0);printf("\n%d-%d-%02d", plocaltime->tm_year + 1900, plocaltime->tm_mon + 1, plocaltime->tm_mday);printf(" %d:%d:%d\n",plocaltime->tm_hour,plocaltime->tm_min,plocaltime->tm_sec);char* pctime = ctime(&timer0);printf("\n%s\n", pctime);    char* pasctime = asctime(plocaltime);    printf("\n%s\n", pasctime);    time_t time1;    time1 = mktime(plocaltime);    printf("\n%lld\n", time1);    return 0;}

执行结果:

2.计算程序运行的时间

2.1预备知识点

2.1.1 clock_t 类型

只需要了解这个时间类型即可

本质也是无符号长整型(unsigned long),适合用来存储与CPU时间相关的变量

2.1.2 clock()函数

函数原型:clock_t clock(void);

//得到 程序开始执行到调用该函数执行时经过的CPU计时单元

函数解释:从函数启动到执行到该函数占用CPU的时间,返回值并不是简单的秒或者毫秒,而是两者之间经过的CPU时钟计时单元(clock tick)数,若返回值错误,则返回-1(有时候,使用前需要先判断函数返回值是否有效);

2.1.3 CLOCKS_PER_SEC

标准c的time.h头函数中宏定义的一个常数,表示一秒钟内CPU运行的时钟周期【计时单元】数,用于将clock ()函数的结果转化为以秒为单位的量,这个量的具体值是与操作系统相关的

CPU时钟计时单元(clock tick)数 / 该值 = 经过的秒数

2.2计算程序运行的时间

思路:

1.首先定义两个clock_t 类型的变量 start 、end,用来接收clock函数的返回值

2.在程序开始的地方和末尾调用clock函数

3.将end-start 【进过的时钟计时单元】的值转化为经过的秒数

#define _CRT_SECURE_NO_WARNINGS#include #include int main(){    clock_t start, end;    start = clock();    for (unsigned int i = 0; i %0.3f\n", (double)(end - start) / CLOCKS_PER_SEC);         //将clock_t类型强制转化为double类型    //     //%f表示打印double类型的数据  %.3f表示只打印小数点后3位的值}

3.动态打印系统的时间

3.1利用Sleep延时函数

思路:

1.time函数可以得到此时的时间戳,写一个循环函数,一直获取实时的时间戳

2.使用localtime函数将时间戳转化为包含当前时间信息的tm类型的数据,并打印出来

3.利用Sleep函数,延时1000ms后,再打印时间戳更新后的时间

代码如下:

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){while (1){time_t timer;time(&timer);struct tm* ptimer = localtime(&timer);printf("当前系统时间->%d:%d:%02d---有四秒误差\n", ptimer->tm_hour, ptimer->tm_min, ptimer->tm_sec);Sleep(1000);system("cls");}return 0;}

但是会有四秒的误差,不知道是哪里的原因

3.2C语言定时器方式

思路:

1.设置一个静态clock_t的初始值starttime,静态变量初始化为0

2.定义一个clock_t类型的变量endtime,end-starttime的值就是两者之间经过的CPU时钟计时单元数,当值等于CLOCKS_PER_SEC时,说明时间过了一秒,开始执行显示时间的程序

3.将starttime的值更新为endtime

4.当新的endtime-新的starttime等于CLOCKS_PER_SEC时,说明又过了一秒,清屏+显示新的时间,如此循环往复

5.这样的话,不影响主循环其它程序的执行

6.如果想在定时器内同时完成几个时间,可以传不同的时间(duration),但是记得要定一个starttime的数组,来分别存储不同计时模式下endtime的值

6.但是缺点是:当主程序有scanf函数时,程序被卡在scanf处,,无法实时更新

7.最好是采用类似于单片机中断函数那样的方式来进行实时时间的显示,但是现在我不会;

程序如下:

#define _CRT_SECURE_NO_WARNINGS#include #include #include void gettimer(unsigned long duration,int mode){static clock_t starttime[5];clock_t endtime = clock();  //起始时间if ((unsigned int)(endtime - starttime[0]) / CLOCKS_PER_SEC >= duration){system("cls");time_t timer1;time(&timer1);struct tm* ptimer1 = localtime(&timer1);printf("当前系统时间->%d:%02d:%02d", ptimer1->tm_hour, ptimer1->tm_min, ptimer1->tm_sec);starttime[0] = endtime;}}int main(){while (1){gettimer(1, 0);}}