C语言-获取系统时间

article/2025/10/3 13:39:12

目录

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-60int tm_min;   // 分,范围0-59int tm_hour;  // 时,范围0-23int tm_mday;  // 日,范围1-31int tm_mon;   // 月,范围0-11,使用时需+1处理int tm_year;  // 年,使用时需+1970int tm_wday;  // 周,范围0-6,使用时需+1int 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 <time.h>
#include <stdio.h>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 <time.h>
#include <stdio.h>
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 <time.h>
#include <stdio.h>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 <time.h>
#include <stdio.h>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 <time.h>
#include <stdio.h>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 <time.h>
#include <stdio.h>int main()
{clock_t start, end;start = clock();for (unsigned int i = 0; i < 50000; i++){printf("\n hskwcy!\n");}end = clock();printf("\n循环执行的时间-->%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 <stdio.h>
#include <time.h>
#include <windows.h>
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 <stdio.h>
#include <time.h>
#include <windows.h>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);		}}


http://chatgpt.dhexx.cn/article/4jE76kAl.shtml

相关文章

shell脚本函数返回数组

执行脚本&#xff08;文件my.sh&#xff09;&#xff0c;输出结果

子函数返回数组(指针和结构体)

一般用void的话就是没有返回值和不需要返回值的了&#xff0c;如调用一个输出函数&#xff0c;这个函数就没必要返回了&#xff0c;事实上这个函数只管输出就好了&#xff0c;也没有什么值要返回的&#xff0c;另一种是用指针传址的时候&#xff0c;因为你传的是地址&#xff0…

c++函数返回数组类型

c函数返回数组类型 首先&#xff0c;C 不允许返回一个完整的数组作为函数的参数。但是&#xff0c;可以通过指定不带索引的数组名来返回一个指向数组的指针。C 不支持在函数外返回局部变量的地址&#xff0c;除非定义局部变量为 static 变量。 方法一&#xff1a;将返回值定义…

C++ 函数返回数组处理方法

最近在通过函数返回数组时踩到了一些坑&#xff0c;在此记录一下。 首先C函数的返回类型没有“数组”这一结构&#xff0c;因此一般情况下我们会采用指针去接受数组的首地址来进行返回。另外由于函数体内定义的变量均为局部变量&#xff0c;局部变量被存储在栈区会在函数调用完…

c++ 函数返回数组

以下转自&#xff1a;http://blog.csdn.net/lijiayu2015/article/details/52821562 C中函数是不能直接返回一个数组的&#xff0c;但是数组其实就是指针&#xff0c;所以可以让函数返回指针来实现。 不能直接返回函数中定义的数组&#xff0c;会被释放掉 float* add(a[3],b[3]…

C++如何让函数返回数组

C如何返回数组 1.前言指针与指针变量的区分背景 2.正文第一次&#xff08;❌&#xff09;第二次&#xff08;✔&#xff09;优化vector 方法 3.总结4.更新日志 1.前言 指针与指针变量的区分 int x5; &x //这是指针 变量x的地址叫做它的指针 int * tem…

函数的返回值——数组返回

在C语言中&#xff0c;首先来对函数的返回值来温习一下&#xff1a; 函数调用使主调函数得到一个确定的值&#xff0c;这就是函数的返回值。函数的返回值是通过return 语句获得的。 那我们来提一个这样的问题&#xff0c;如果是一个数组通过排序后&#xff0c;得到了一个新的…

深度学习环境搭建之三_离线安装无线网卡、DKMS

2020.12.08更新&#xff1a;最近又离线装了一次Ubuntu系统。这次离线安装DKMS会报错&#xff0c;没有gcc、make&#xff1b;网上看了一下&#xff0c;gcc离线安装很麻烦&#xff0c;总得来看&#xff0c;还是放弃离线安装Ubuntu吧&#xff0c;联网后安装难度下降99% 【上次难道…

解决一例Fedora 31安装NVIDIA官方驱动程序无法使用DKMS注册的问题

更新&#xff1a; If Not True Then False提供了一份Patch后的340.108版驱动&#xff0c;直接使用此版驱动安装包不会遇到DKMS报错&#xff0c;升级5.5内核时也没有问题&#xff0c;点击进入下载页面。 手头一台Dell D630的本本&#xff0c;虽然已经10年以上寿命&#xff0c;拿…

DKMS:Dynamic Kernel Module Support

DKMS简介 DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。 1.背景 对于没有内核编程经验的使用者来说&#xff0c;使用者可能经常困惑&#xff1a;为什么更新操作系统之后&#xff0c;原来用的好好的…

DKMS(大开门是什么意思)

ZS,DZ,DKMS玩了很久了,RAIDJJC也玩了不少了&#xff0c;现 盗贼刚刚又被加强了.其实无论什么职业竞争,都是靠人脉和职业本身无关,刚开TBC的时候DZ下副本没人要.我们亲友团的DZ跟我们一路走来,一个副本也没拉下.所以固定亲友团才是王道.选择自己喜欢的职业,别光顾着好拿装备. 商…

DKMS是什么?

我们都知道&#xff0c;如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然&#xff0c;这并不是一件什么难事&#xff0c;即使是对于没有编程经验的Linux使用者&#xff0c;只要稍微有点hacker的意识&#xff0c;努力看看代码包里的Readme或者INSTALL文件&#x…

深度linux安装dkms,安装Virtualbox 错误提示安装DKMS解决方法

玩蛇网推荐图文教程:python 列表 安装Virtualbox 错误提示安装DKMS解决方法。在open 12.3安装Virtualbox出错了,最开始提示什么安装DKMS,然后下载安装后出现如图的错误。Failed, trying without DKMS让人头疼。 下面把错误提示图和提示贴出来了 sincerefly@linux-eq1f:~/Dow…

DKMS简介

我们都知道&#xff0c;如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然&#xff0c;这并不是一件什么难事&#xff0c;即使是对于没有编程经验的Linux使用者&#xff0c;只要稍微有点hacker的意识&#xff0c;努力看看代码包里的Readme或者INSTALL文件&#x…

如何解决接口幂等性问题?

什么是幂等性&#xff1f; 参考地址&#xff1a;解决幂等问题 概念&#xff1a; 一个接口&#xff0c;不管我调多少次&#xff0c;只要参数不变&#xff0c;结果也应该不变。 但是在实际工作中&#xff0c;幂等性一般分为两种&#xff1a; 请求幂等&#xff1a;每次请求&…

接口幂等性的理解

一. 什么是接口幂等性 幂等性原本是数学上的概念&#xff0c;用在接口上就可以理解为&#xff1a;同一个接口&#xff0c;多次发出同一个请求&#xff0c;必须保证操作只执行一次。它是系统服务对外的一种承诺&#xff08;注意不是一种实现&#xff09;&#xff0c;接口服务提…

什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?

博主负责的项目报了一个问题&#xff0c;用户操作回退失效。我们的设计里&#xff0c;操作回退是回到操作前的状态。经过查看日志发现&#xff0c;用户之前的操作做了两次&#xff0c;也就是说提交操作的接口被调用了两次&#xff0c;导致之用户上一次的状态和这一次的状态是一…

接口幂等性校验

接口幂等性校验 一、概念 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数&#xff0c;或幂等方法&#xff0c;是指…

接口幂等性这么重要,它是什么?怎么实现?

什么是幂等性&#xff1f; 对于同一笔业务操作&#xff0c;不管调用多少次&#xff0c;得到的结果都是一样的。 幂等性设计 我们以对接支付宝充值为例&#xff0c;来分析支付回调接口如何设计&#xff1f; 如果我们系统中对接过支付宝充值功能的&#xff0c;我们需要给支付宝…

接口的幂等性怎么设计?

自己最近负责的几个接口&#xff0c;都涉及到了幂等性的操作&#xff0c;抽空总结了一下&#xff0c;这也是面试官比较爱问的问题。 一、什么是幂等&#xff1f; 看一下维基百科怎么说的&#xff1a; 幂等性&#xff1a;多次调用方法或者接口不会改变业务状态&#xff0c;可以…