文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言每日练习之动态显示系统时间

2024-04-02 19:55

关注

分析

C语言的时间库函数基本都在time.h里,该头文件主要包含三种形式的时间量,一种是time_t类型(原型为long),表示当前时间到1970年1月1日的总秒数;一种是struct tm类型,里面是时间日期的数据;还有一种clock_t,这个类型本文用不到,它表示与处理器时钟有关的时间数据。

本文将介绍4种显示系统时间的方法:

代码实现

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 1993\n"


#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;         
  int tm_min;         
  int tm_hour;        
  int tm_mday;        
  int tm_mon;         
  int tm_year;        
  int tm_wday;        
  int tm_yday;        
  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时区时间(不建议使用)

        
        printf("当前时间:%d年%d月%d日 %02d:%02d:%02d\r", 1900 + tm_->tm_year,\
               tm_->tm_mon + 1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);

        
        //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("当前时间:%s\r", 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:%ld\r", 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 星期%1d\n",
		sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, 
		sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); 
		Sleep(1);
		//清屏命令 
		system("cls");
	}
	return 0;
}

运行效果:

他使用清屏来实现单行打印,这样容易造成频闪现象,其实只要将\n换成成\r就行了。

请添加图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯