C语言每日一练——第56天:动态显示系统时间
C语言每日一练
2021年11月8日
题目描述
C语言实现动态打印系统时间
分析
C语言的时间库函数基本都在time.h
里,该头文件主要包含三种形式的时间量,一种是time_t
类型(原型为long),表示当前时间到1970年1月1日的总秒数;一种是struct tm
类型,里面是时间日期的数据;还有一种clock_t
,这个类型本文用不到,它表示与处理器时钟有关的时间数据。
本文将介绍4种显示系统时间的方法:
-
第一种直接用
ctime
函数将time_t
类型的秒数据转换成字符串; -
第二种先通过
time_t
类型变量获取秒数据,然后再用localtime()
函数将秒数据转换成struct tm
类型数据,最后将struct tm
类型变量的结构体成员分别打印,同时打印格式可以自己随意控制。 -
第三种在第二种的基础上,使用
strftime()
函数,格式化打印时间数据
,这些格式有专门的规范
,具体参数可以自行百度。 -
第四种在第三种的基础上,增加了毫秒和微秒显示,不过需要新增一个数据类型
strcut timeval
和gettimeofday()
函数,该函数和time()
作用类似,都是获取秒数,但后者是将获取的秒数传给time_t
类型变量。
具体的函数介绍将在下一章提及。
代码实现
1.简易版
time_t time(time_t *timer)
:time()
是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个time_t类型。
char *ctime(const time_t *timer)
:把日期和时间转换为字符串,函数形参为time_t
类型。
——百度百科
ctime()
这个函数会根据本地时区进行转换,字符串格式为"Wed Jun 30 21 :49 :08 1993n"
#include <stdio.h>
#include <time.h>
int main ()
{
time_t tt;
time(&tt); //获取秒数
printf ( "当前本地时间为: %s", ctime(&tt));
return 0;
}
运行结果:
2.自定义格式版
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; /* 夏令时 */ };
struct tm *gmtime(const time_t *timer)
:将time_t
类型变量转换为struct tm
类型变量,同时使用协调世界时(UTC),也称为格林尼治标准时间(GMT)【应该不常用】
struct tm *localtime(const time_t *timer)
:和gmtime功能类似,将time_t
类型变量转换为struct tm
类型变量,但时间由本地时区决定。
char *asctime(const struct tm *timeptr)
:把日期和时间转换为字符串,函数形参为struct tm
类型。
——百度百科
【注意】tm_year
是从1900年算起,所以打印它时需要加上1900;tm_mon
从0开始算,所以打印它时需要加1。
#include <time.h>
#include <stdio.h>
#include <conio.h> //kbhit()/_kbhit()
#include <Windows.h> //Sleep(ms)
int main(void)
{
time_t tt_;
struct tm *tm_ ;
while(!kbhit()) //按下键盘任意键退出循环(包括鼠标点击)
{
time(&tt_); //获取秒数
tm_ = localtime(&tt_); //将秒数转换为本地时间(北京时间)
//tm_ = gmtime(&tt_); //将秒数转换为UTC时区时间(不建议使用)
/* 自己定义打印样式; %02d:宽度为两个整型,如果不够,左边补零; r:回车不换行 */
printf("当前时间:%d年%d月%d日 %02d:%02d:%02dr", 1900 + tm_->tm_year,
tm_->tm_mon + 1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
/* 使用asctime函数打印tm变量表示的时间( 自带回车换行) */
//printf("当前本地时间为: %s", asctime(tm_));
Sleep(500); //0.5s延时
}
return 0;
}
运行结果:
-
动态打印本地时间(自定义格式):
-
动态打印UTC时间(自定义格式),时间比本地时间早8小时:
-
使用
asctime
函数动态打印本地时间,打印间隔0.5s:
3.格式化输出版
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
:根据format
指定的格式(格式必须符合要求),将时间数据存入字符串str
中,想了解具体的格式,可以自行百度,这里简单介绍下面程序使用到的格式参数:
%Y
:年份(真实年份,不需加1900)
%m
:月份(01-12)
%d
:一月中的第几天(01-31)
%H
:小时(00-23)
%M
:分(00-59)
%S
:秒(00-59)
——百度百科
#include <time.h>
#include <stdio.h>
#include <conio.h> //kbhit()/_kbhit()
#include <Windows.h> //Sleep(ms)
int main(void)
{
time_t tt_;
struct tm *tm_ ;
char output[20];
while(!kbhit()) //按下键盘任意键退出循环(包括鼠标点击)
{
time(&tt_); //获取秒数
tm_ = localtime(&tt_); //将秒数转换为本地时间(北京时间)
/* 格式化打印 */
strftime(output, 20, "%Y-%m-%d %H:%M:%S", tm_);
printf("当前时间:%sr", output); //回车不换行
Sleep(500); //0.5s延时
}
return 0;
}
运行结果:
4.精细版(毫秒+微秒)
struct timeval
结构体成员:struct timeval{ long tv_sec; //秒 long tv_usec; //微秒 };
int gettimeofday (struct timeval * tv, struct timezone * tz)
:获得当前精确时间(1970年1月1日到现在的时间),其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果,函数执行成功后返回0,失败后返回-1
——百度百科
gettimeofday()
和前面提到的time()
函数功能类似,都是获取时间,但它们形参和返回值差别还是很大的。
int main(void)
{
time_t tt_;
struct tm *tm_ ;
struct timeval tv_;
long tv_ms = 0, tv_us = 0;
char output[20];
while(!kbhit()) //按下键盘任意键退出循环(包括鼠标点击)
{
time(&tt_); //获取秒数保存到time_t变量
tm_ = localtime(&tt_); //将秒数转换为本地时间(北京时间)
gettimeofday(&tv_,NULL); //获取1970-1-1到现在的时间保存到timeval变量
/* 格式化打印 */
strftime(output, 20, "%Y-%m-%d %H:%M:%S", tm_);
tv_ms = tv_.tv_usec / 1000;//获取毫秒
tv_us = tv_.tv_usec % 1000;//获取微秒
printf("当前时间:%s %ld:%ldr", output,
tv_ms / 10, tv_us / 10); //改成100进1
Sleep(1); //ms延时
}
return 0;
}
运行结果:
网上参考
网上找到一篇能够显示毫秒的时间打印代码,不过只适用于Windows平台
:
原文链接:用C语言动态打印当前时间(精确到毫秒)
#include <stdio.h>
#include <windows.h>
int main( void )
{
SYSTEMTIME sys;
while(1){
printf("当前时刻为:n");
//获取系统时间
GetLocalTime( &sys );
//按照年/月/日 时/分/秒.毫秒 星期几格式打印
printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1dn",
sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,
sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
Sleep(1);
//清屏命令
system("cls");
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「林仔520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37955704/article/details/109284457
运行效果:
他使用清屏来实现单行打印,这样容易造成频闪现象,其实只要将
n
换成成r
就行了。