时间函数的简单理解和应用(time.h)
关于时间的函数及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;
}
运行后结果如下:
热门相关:来自地狱的男人 超级吸收 独步仙尘 不愿恋爱的雀斑小姐 呆萌配腹黑:绝宠小冤家