时间函数的简单理解和应用(time.h)

news/2024/10/2 18:30:17

目录
  • 关于时间的函数及tm结构体描述
  • 对函数的简单理解操作
  • 函数功能实现

关于时间的函数及tm结构体描述

  • time.h头文件中常用的几个函数描述如下:
序号 函数&描述
1 time_t time(time_t *tloc)
最基础的函数,计算当前时间,并返回成 time_t(aka long int)格式
而且返回值是从Epoch(1970年1月1日)算起的秒数(second),可另起变量接受返回值,也可用tloc指针接收。
2 char *asctime(const struct tm *tm)
传入tm结构体参数,返回一个指向字符串的指针,它代表了结构体tm能代表的日期和时间。
3 char *ctime(const time_t *timep)
传入tmep指针参数,返回一个表示当地时间的字符串,当地时间是基于参数 timep。
与asctime的功能类似,区别仅为接收的参数不同,一个是结构体tm,一个是时间戳。
4 struct tm *gmtime(const time_t *timep)
timep 的值被分解为 tm 结构体,并用协调世界时(UTC)(也被称为格林尼治标准时间(GMT))表示
与localtime函数的区别在于,gmtime不考虑时区的因素,始终返回UTC时间。
5 struct tm *localtime(const time_t *timep)
timep 的值被分解为 tm 结构,并用本地时区表示
6 double difftime(time_t time1, time_t time2)
返回 time1 和 time2 两个时间戳之间相差的秒数 (time1-time2)。
7 time t mktime(struct tm *tm)
把 tm 所指向的结构转换为一个依据本地时区的 timet值,功能与ctime相反。而且已经考虑了闰年等复杂计算问题
  • 此外,还需要了解一个重要的概念,即struct tm *tm,函数原型如下:
struct tm
{int tm_sec;			/* Seconds.	[0-60] (1 leap second) */int tm_min;			/* Minutes.	[0-59] */int tm_hour;			/* Hours.	[0-23] */int tm_mday;			/* Day.		[1-31] */int tm_mon;			/* Month.	[0-11] */int tm_year;			/* Year	- 1900.  */int tm_wday;			/* Day of week.	[0-6] */int tm_yday;			/* Days in year.[0-365]	*/int tm_isdst;			/* DST.		[-1/0/1]*/
...
};

由tm函数原型的注释得出,在引用tm结构体中月份和年份的时候,需要做简单的算术运算:

/*
星期: stdTime->tm_wday
月份:stdTime->tm_mon + 1  日期:stdTime->tm_mday
时刻:stdTime->tm_hour  stdTime->tm_min  stdTime->tm_sec 
年份:stdTime->tm_year + 1900 
*/

对函数的简单理解操作

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{time_t t = 0;time_t curTime = time(NULL); // 从1970.1.1开始到现在的秒数time(&t);//尝试利用time的参数接收返回值printf("curTime=%ld \nt=%ld\n", curTime, t);//进行结果对比struct tm *stdTime = localtime(&curTime); printf("curTime=%s \n", ctime(&curTime));   // 使用ocaltime 函数与ctime函数进行对比printf("Wkday:%d\nMonth:%d %d\nTime:%d %d %d\nYear:%d\n", stdTime->tm_wday, stdTime->tm_mon + 1, stdTime->tm_mday, stdTime->tm_hour, stdTime->tm_min, stdTime->tm_sec, stdTime->tm_year + 1900);return 0;
}

函数功能实现

/*** @brief 利用时间函数,每2秒在log.txt文件中输入最新时间,并覆盖原来的时间* @date 2024/05/08* CopyRight (c)  2023-2024   ni456xinmie@163.com   All Right Reseverd*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{if (2 != argc) // 判断函数调用时的参数是否输入正确{printf("Usage:%s<dst>\n", argv[0]);exit(1);}FILE *fp = NULL;           // 申请结构体指针变量struct tm *stdTime = NULL; // 申请tm结构体变量time_t curTime = 0;        // 申请时间戳变量while (1){/*此处在循环体内进行打开/关闭文件并错误判断,因为如果不进行这一步,则会无法打开文件看到时间覆盖的动作。因此这一步需要根据具体设备来调整。*/if (NULL == (fp = fopen(argv[1], "a")))//用a进行追加写入,效果更明显;不然可以直接用w进行覆盖操作{perror("Open failed.\n");exit(1);}curTime = time(NULL);          // 获取当前时间戳stdTime = localtime(&curTime); // 使用localtime 函数,并获取时间,传入tm结构体if ((fprintf(fp, "%d 年 %d 月 %d 日  星期%d  %d时%d分%d秒\n", stdTime->tm_year + 1900, stdTime->tm_mon + 1, stdTime->tm_mday, stdTime->tm_wday, stdTime->tm_hour, stdTime->tm_min, stdTime->tm_sec) == EOF))printf("Input time failed.\n"); // 对文件进行输入时间,并同时进行错误判断fclose(fp);                         // 循环体内进行关闭文件操作,同第22行sleep(2);}return 0;
}

运行后结果如下:

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

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

相关文章

Streamlit:快速构建可视化网页(数据科学必备)

很多算法工程师在完成数据分析、模型训练或者项目总结的时候,往往只能通过ppt汇报,添加数据图表、截图模型实验结果等。如果想提供一个前端演示demo,通常可以搭建flask服务,但是flask需要学习很多前端知识,如css、html等,这又是一个深之又深的坑。那有没有什么工具能够跳…

SpringBoot项目GraalVM迁移

一些背景 一直想把项目迁移到使用GraalVM构建出的原生应用上,但是在前段时间的一次尝试后,发现很难做到,其中一个最主要原因就在于我目前手头上没有X86架构的电脑。平时我使用的是一个M1处理器的MacBook,编译出的Docker镜像架构指令集也是Arm64的,无法在我的X86服务器启动…

董浩影评

本文来自博客园,作者:东岸,转载请注明原文链接:https://www.cnblogs.com/donghao99/p/18182035

Rust | 实现 API 限速操作 Example

在这篇文章中,我们将讨论如何在 Rust 中实现 API 限速。当涉及到生产中的服务时,是为了确保不良行为者不会滥用 API——这就是 API 限速的作用所在。 我们将实现 “滑动窗口” 算法,通过动态周期来检查请求历史,并使用基本的内存 hashmap 来存储用户 IP 及其请求时间。我们…

Tasks 和算子链

Flink中的每一个操作算子称为一个Task(任务),算子的每个具体实例则称为SubTask(子任务),SubTask是Flink中最小的处理单元,多个SubTask可能在不同的机器上执行。一个TaskManager进程包含一个或多个执行线程,用于执行SubTask。 TaskManager中的一个Task Slot对应一个执行…

MT3516W-ASEMI工业电源专用MT3516W

MT3516W-ASEMI工业电源专用MT3516W编辑:ll MT3516W-ASEMI工业电源专用MT3516W 型号:MT3516W 品牌:ASEMI 封装:MTW-5 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):35A 功率(Pd):大功率 芯片个数:5 引脚数量:5 类型:插件整流桥、整流方桥 正向浪涌电流:45…

会充电的CANoe-赋能新能源汽车,高效完成即插即充(PnC)智能充电功能测试

ISO 15118-2标准中描述的PnC功能,可以实现插枪即充电,识别、计费信息、充电参数都通过高级别通信在EV和EVSE之间自动交换。简化了电动汽车的充电过程,提高了用户体验,为电动汽车行业带来了更智能、更便捷的充电解决方案。然而,电动汽车和充电站之间要实现自动通信和计费,…

03 插入排序

03 插入排序1.插入排序的含义类似扑克牌,假设认为0-0位置有序,再把0-1的位置变有序,循环直到所有的有序。每次拿取右侧的数字,一个一个对比放到左侧来。2.示例代码 def insertion_sort(arr):if arr is None or len(arr) < 2:returnfor i in range(1, len(arr)):# 0 ~ i-…