【C语言】time.h——主要函数介绍(附有几个小项目)

news2024/11/19 13:13:30
time.h是C标准函数库中获取时间与日期、对时间与日期数据操作及格式化的头文件。

返回值类型

  1. size_t:适合保存sizeof的结果,类型为unsigned int(%u)
  2. clock_t:适合存储处理器时间的类型,一般为unsigned long(%lu)
  3. time_t:适合储存日历时间类型,一般情况下是long。(%ld)
  4. struct tm:保存时间和日期的结构
// 原文注释更容易理解变量的命名
struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */  // +1
   int tm_year;        /* The number of years since 1900   */  // +1900
   int tm_wday;        /* day of the week, range 0 to 6    */  // +1
   int tm_yday;        /* day in the year, range 0 to 365  */  // +1
   int tm_isdst;       /* daylight saving time             */
};

宏定义

  1. NULL:空指针
  2. CLOCKS_PER_SEC:其值为1000,表示一秒CPU运行的时钟周期数为1000个,相当于1ms一个时钟周期,因此一般说操作系统的单位是毫秒。

time

功能:返回当前日历时间值,这个值是将时间按照一定逻辑计算得来的

  • 年数 = 天数 * 小时 * 分钟 * 秒(年数 = 365 * 24 * 60 * 60)
  • 得到的日历时间值除于年数,得到结果为自1970年1月1日后经历得年数

函数原型:time_t time(time_t *timer)

返回值:返回自纪元(00:00:00 UTC,1970 年 1 月 1 日)以来的时间,以秒为单位。如果timer不为 NULL,则返回值也存储在变量 timer 中。time_t类型,一般情况下是长整型。(%ld)

参数:为指针类型(一般传入NULL),秒值将存储在指针中。

  • time_t now = time(NULL); // 等价为time(&now);

注意:

  1. 注意区分struct tm中的1900年
  • 返回当前日历时间值

    #include <stdio.h>
    #include <time.h>
    
    int main () {
       time_t now = time(NULL);
    
       printf("The final resultl is %ld\n", now);
       return(0);
    }
    

    得到的结果为:The final resultl is 1704711506

    1704711506 / 365 / 24 / 60 / 60 结果约等于54,加上1970后即为2024

clock

功能:记录程序开始以来使用的时钟周期数,可以记录某段程序执行耗时

函数原型:clock_t clock(void)

返回值:返回 程序开始以来使用的时钟周期数,失败则返回-1。clock_t类型(%ld)

  • 计算一段代码所需要的时间

    #include <time.h>
    #include <stdio.h>
    
    int main () {
       clock_t start_t, end_t;
       double total_t;
       int i;
    
       start_t = clock();
       printf("Going to scan a loop, start_t = %ld\n", start_t);
       for(i=0; i< 50000000; i++);
    
       end_t = clock();
       printf("End of the big loop, end_t = %ld\n", end_t);
       
       total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;  // 得到的结果是以 秒 为单位的
       printf("Total time taken by CPU: %f\n", total_t  );
       printf("Exiting of the program...\n");
    
       return(0);
    }
    

difftime

功能:返回 time1 和 time2 之间的秒差,即 (time1 - time2)。 这两个时间以日历时间为单位指定,表示自纪元(1970 年 1 月 1 日 00:00:00,协调世界时 (UTC))以来经过的时间。

函数原型:double difftime(time_t time1, time_t time2)

参数:

  • time1 − 这是结束时间time_t对象。
  • time2 − 这是开始时间time_t对象

返回值: time1 和 time2 之间的秒差作为双精度值返回

  • 计算一段代码所需要的时间

    #include <stdio.h>
    #include <time.h>
    
    int main () {
       time_t start_t, end_t;
       double diff_t;
    
       printf("Starting of the program...\n");
       time(&start_t);
    
       printf("Sleeping for 5 seconds...\n");
       sleep(5);
    
       time(&end_t);
       diff_t = difftime(end_t, start_t);
    
       printf("Execution time = %f\n", diff_t); // 结果就是以 秒 为单位的
       printf("Exiting of the program...\n");
    
       return(0);
    }
    
  • my_difftime

    double my_difftime(time_t time1, time_t time2){
    	return (double)(time1 - time2);
    }
    

localtime

功能:C 库函数 struct tm localtime(const time_t timer) 使用计时器**指向的时间,用表示相应本地时间的值填充 tm 结构。timer 的值被分解为结构 tm,并以当地时区表示。

函数原型:struct tm *localtime(const time_t *timer)

参数:timer是指向表示日历时间的time_t值的指针,即传入time_t类型的地址。

返回值:返回指向填充了时间信息的 tm 结构的指针,失败则返回NULL。

  • 获取当前日期(当前的和多少天之后的,多少天之前的)

    #include <stdio.h>
    #include <time.h>
    
    void GetTime(){
        time_t now = time(NULL);  // 获取当前时间状态
    //		now += 10 * 24 * 60 * 60; // 获取十天后的时间状态(天 * 时 * 分 * 秒)
    //		now -= 10 * 24 * 60 * 60; // 获取十天前的时间状态(天 * 时 * 分 * 秒)
    
        struct tm *info = localtime(&now);  
        int year = info->tm_year + 1900;
        int month = info->tm_mon + 1;
        int day = info->tm_mday;
        int hour = info->tm_hour;
        int minute = info->tm_min;
        int second = info->tm_sec;
    
        printf("Current time: %d-%02d-%02d %02d:%02d:%02d\n", 
        			year, month, day, hour, minute, second);
    }
    
    int main(){
    	GetTime();
    	return 0;
    }
    

mktime

功能:根据本地时区将 timeptr 指向的结构转换为time_t值。

函数原型:time_t mktime(struct tm *timeptr)

参数:timeprt 是指向结构体tm的指针,即传入struct tm类型的地址。(tm在上面有介绍)

返回值:此函数返回与作为参数传递的日历时间相对应的time_t值。出错时,返回 -1 。

  • 将日期转为时间状态值

    #include <stdio.h>
    #include <time.h>
    #include <math.h> // for abs
    
    // 将日期转为time_t
    // 利用这个函数,可以计算两个日期之间相隔多少天
    time_t tm_convert(int year, int month, int day,
                      int hour, int minute, int second)
    {
        struct tm time_convert;
        time_convert.tm_year = year - 1900;
        time_convert.tm_mon = month - 1;
        time_convert.tm_mday = day;
        time_convert.tm_hour = hour;
        time_convert.tm_min = minute;
        time_convert.tm_sec = second;
    
        return mktime(&time_convert);
    }
    
    void DiffDay()
    {
        time_t start = tm_convert(2023, 12, 15, 0, 0, 0);
        time_t end = tm_convert(2002, 5, 19, 0, 0, 0);
    
        double diff = difftime(start, end);
        int day = (int)(diff / (24 * 60 * 60)); // 每天所有的秒数
    
        printf("相隔%d天.\n", abs(day));
    }
    
    int main()
    {
        DiffDay();
        return 0;
    }
    

ctime

功能:返回一个基于参数 timer 的、带有日期信息的字符串,其中包含人类可读格式的日期和时间信息,表示 localtime。

函数原型:char *ctime(const time_t *timer)

返回值:返回一个字符串指针,失败则通常返回NULL。返回的字符串采用以下格式:Www Mmm dd hh:mm:ss yyyy,其中 Www 是工作日,Mmm 是以字母表示的月份,dd 是月份的日期**,hh:mm:ss** 是时间,yyyy 是年份。

参数: 指向包含日历时间的time_t对象的指针。

  • 获取当前日期

    #include <stdio.h>
    #include <time.h>
    
    int main () {
       time_t now = time(NULL);
       printf("Current time = %s", ctime(&now));
       return(0);
    }
    
    • 结果
      Current time = Tue Jan 09 00:00:17 2024

asctime

功能:返回一个字符串指针。其中包含人类可读格式的日期和时间信息,表示localtime

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

参数:是指向struct tm的一个指针

返回值:此函数返回一个 C 字符串,失败则通常返回NULL。返回的字符串格式为:www Mmm dd hh:mm:ss yyyy,其中 Www 是工作日,Mmm 是字母中的月份,dd 是月份的日期,hh:mm:ss 是时间,yyyy 是年份。

小项目

  • 制作简易时钟

    /*
        制作的一个能显示时间的简易时钟
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    
    // 带颜色的打印函数
    void print_with_color(char *str, int color)
    {
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, color);
        printf("%s", str);
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    
    int main(){
        while(1){
            /* 这两个放在外面的话,就不能一直获取当前时间了 */
            time_t t = time(NULL);
            struct tm *now = localtime(&t);
            char str_t[100]; 
            sprintf(str_t, "------------------------\n");
            print_with_color(str_t, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    
            sprintf(str_t, "| %d/%02d/%02d  %02d:%02d:%02d |\n", 
                        now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec);
            print_with_color(str_t, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            
            sprintf(str_t, "------------------------\n");
            print_with_color(str_t, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            Sleep(1000);
            system("cls");
        }
        return 0;
    }
    
    /*
    
    1. print_with_color() 函数:用于将字符串打印到控制台并设置颜色。
    2. time() 函数:获取当前的时间戳。
    3. localtime() 函数:将时间戳转换为本地时间。
    4. sprintf() 函数:根据格式化字符串生成一个字符串。
    5. FOREGROUND_BLUE、FOREGROUND_GREEN、FOREGROUND_RED、FOREGROUND_INTENSITY 常量:设置文本颜色。
    6. Sleep() 函数:暂停一段时间,单位是毫秒。
    7. system("cls"):清空控制台。
    	在主函数中,程序使用了一个死循环,不断获取当前时间并更新时钟。
    首先,程序使用 time() 函数获取当前时间戳,并使用 localtime() 
    函数将其转换为本地时间。然后,程序使用 sprintf() 函数将时钟字符
    串格式化,并使用 print_with_color() 函数将其打印到控制台。接着,
    程序使用 Sleep() 函数暂停一秒钟,以便下一次更新时钟。最后,程序
    使用 system("cls") 函数清空控制台,以便下一次绘制时钟。
    
    */
    
    • 结果
      在这里插入图片描述
  • 制作简易日历

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        time_t t = time(NULL);
        struct tm *tm = localtime(&t);
    
        int year = tm->tm_year + 1900;
        int month = tm->tm_mon + 1;
        int day = tm->tm_mday;
    
        printf("当前日期:%d年%d月%d日\n", year, month, day);
    
        struct tm firstDay;
        firstDay.tm_year = year - 1900;
        firstDay.tm_mon = month - 1;
        firstDay.tm_mday = 1;
        mktime(&firstDay);
    
        int weekday = firstDay.tm_wday;
    
        printf("日 一 二 三 四 五 六\n");
    
        for (int i = 0; i < weekday; i++) {
            printf("   ");
        }
    
        int daysInMonth;
        switch (month) {
            case 2:
                if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
                    daysInMonth = 29;
                else
                    daysInMonth = 28;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                daysInMonth = 30;
                break;
            default:
                daysInMonth = 31;
        }
    
        for (int d = 1; d <= daysInMonth; d++) {
            if (d == day) {
                printf("\033[1;31m%2d\033[0m ", d); // 使用红色高亮显示今天的日期
            } else {
                printf("%2d ", d);
            }
            if ((weekday + d) % 7 == 0)
                printf("\n");
        }
    
        return 0;
    }
    
    • 结果
      在这里插入图片描述
  • 输入日期,计算当前日期是这一年中的第几天(time.h)
    (之前发布的一个博客不是用time.h来编写的,这次使用time.h做一个补充)

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        // 初始化
        int year, month, day;
        time_t now = time(NULL);
        struct tm *timeinfo = localtime(&now);
    
        // 获取用户输入日期
        printf("请输入日期(格式:YYYY-MM-DD):");
        scanf("%d-%d-%d", &year, &month, &day);
    
        // 更新timeinfo结构体的年月日信息
        timeinfo->tm_year = year - 1900;
        timeinfo->tm_mon = month - 1;
        timeinfo->tm_mday = day;
    
        // 计算并输出这一年中的第几天
        int day_of_year = timeinfo->tm_yday + 1;
        printf("输入日期在这一年中是第 %d 天\n", day_of_year);
    
        return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day 43动态规划(5)

day 43 代码随想录 2024.1.10 发烧中。。。简单过一遍等二刷DP问题&#xff01;&#xff08;最近赶一篇paper&#xff01;&#xff09; 1. 1049最后一块石头的重量 dp[j]表示容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为j的背包&#xff0c;最多…

51单片机介绍

1 单片机简介 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设…

基于JavaWeb+BS架构+SpringBoot+Vue校园一卡通系统的设计和实现

基于JavaWebBS架构SpringBootVue校园一卡通系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第一章 概述 4 1.1 研究背景 4 1.2研究目的及意义 4 1.3国内外发展现状 4 1…

DePIN:重塑物理资源网络的未来

点击查看TechubNews更多相关推荐 一、DePIN&#xff1a;物理资源的新整合方式 Depin赛道的项目如雨后春笋般涌现&#xff0c;为市场注入了新的活力。作为先行者&#xff0c;Coinmanlabs已经深入布局Depin赛道&#xff0c;其中最引人注目的项目当属Grass。 什么是DePIN DePIN…

Java项目:114SSM图书管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 图书管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要实现了图书馆借书还书功能&#xff0c;系统分为管理员和读者两种角色。 管理员功能如下…

A股风格因子看板 (2024.01 第4期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第4期&#xff0c;指数组合数据截止日2024-12-01&#xff0c;要点如下 近1年A股风格因子检验统…

Linux内存管理:(七)页面回收机制

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 触发页面回收 Linux内核中触发页…

TS 36.213 V12.0.0-PUCCH过程

​本文的内容主要涉及TS 36.213&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

javaWebssh校园物业管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh校园物业管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

2024年天津财经大学珠江学院专升本专业考试准考证打印及考试安排

天津财经大学珠江学院关于2024年高职升本科专业课考试准考证打印等事宜的通知 天津财经大学珠江学院2024年高职升本科专业课考试将于2024年1月14日举行&#xff0c;为确保考试顺利进行&#xff0c;在此提醒各位考生&#xff0c;请务必认真阅读并严格遵守以下事项。 一、考试地…

代码随想录刷题题Day29

刷题的第二十九天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day29 任务 ● 01背包问题&#xff0c;你该了解这些&#xff01; ● 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 …

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(五)—— 项目-新闻头条-数据管理平台-ajax综合案例前端

愿许秋风知我意&#xff0c;解我心中意难平。 项目介绍 项目准备 推荐使用&#xff0c; 每个程序员都有自己的管理方式。 验证码登录 HTML结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><met…

.NetCore部署微服务(二)

目录 前言 概念 一 Consul注册服务中心 1.1 consul下载 1.2 consul运行 二 服务注册 2.1 安装Consul包 2.2 修改配置文件 2.3 注入Consul服务 2.3 修改Controller&#xff0c;增加HealthCheck方法 三 运行服务 3.1 docker运行服务 前言 上一篇讲到微服务要灵活伸缩…

第六讲_css盒子模式

css盒子模型 1. 长度单位2. 盒子模型的组成2.1 盒子模型内容2.2 盒子模型内边距2.3 盒子模型边框2.4 盒子模型外边距 1. 长度单位 px&#xff1a;像素em&#xff1a;相对于当前元素或父元素的 font-size 的倍数 <style>.parent {height: 500px;width: 500px;background…

控制注塑机PQ比例阀放大器

控制不带电反馈的单或双比例电磁铁的博世力士乐&#xff08;Bosch Rexroth&#xff09;、伊顿威格士&#xff08;EATON Vickers&#xff09;、油研&#xff08;YUKEN&#xff09;、贺德克&#xff08;HYDAC&#xff09;、大金&#xff08;DAIKIN&#xff09;、不二越&#xff0…

API(Math类,System类,Runtime类,Object类,Objects类,BigInteger类,BigDecimal类)

文章目录 课程目标1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数)1.5 课后练习 2 System类2.1 概述2.2 常见方法 3 Runtime3.1 概述3.2 常见方法3.3 恶搞好基友 4 Object类4.1 概述4.2 常见方法 5 Objects类5.1 概述5.2 常见方法 6 BigInteger类6.1 引入…

微信小程序的生命周期函数有哪些?

面试官&#xff1a;说说微信小程序的生命周期函数有哪些&#xff1f; 一、是什么 跟vue、react框架一样&#xff0c;微信小程序框架也存在生命周期&#xff0c;实质也是一堆会在特定时期执行的函数 小程序中&#xff0c;生命周期主要分成了三部分&#xff1a; 应用的生命周期…

用React给XXL-JOB开发一个新皮肤(二):目录规划和路由初始化

目录 一. 简述二. 目录规划三. Vite 配置 3.1. 配置路径别名3.2. 配置 less 四. 页面 4.1. 入口文件4.2. 骨架文件4.3. 普通页面 五. 路由配置六. 预览启动 一. 简述 上一篇文章我们介绍了项目初始化&#xff0c;此篇文章我们会先介绍下当前项目的目录规划&#xff0c;接着对…

学习JavaEE的日子 day11 初识面相对象

day11 1.初识面相对象 1.1 类和对象的理解 类 * 类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合 * 简单理解&#xff1a;类就是对现实事物的一种描述 类的组成 * 属性&#xff1a;指事物的特征&#xff0c;例如&#xff1a;手机事物&#xff08;品牌…