linux系统函数之mktime
1、一些基本概念
(1)开始时间,linux时间从1970年1月1日开始计数,记录从1900年1月1日开始到现在的秒数。
(2)使用mktime的目的,将struct tm 结构的时间转换为从1970年至今的秒数。也就是UTC时间。
(3)有关的数据类型
① time_t
time_t类型,这本质上是一个长整数( long ),表示从1970-01-01 00:00:00到目前计时时间的秒数,timeval则精确到毫秒。
原型:time_t time(time_t *t);
② timeval
timeval类型,这是一个结构体类型,struct timeval 头文件为 time.h。
原型
struct timeval
{
time_t tv_sec; /* Seconds. */
//秒
suseconds_t tv_usec; /* Microseconds. */
//微秒
};
③ timezone
struct timezone
{ int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of DST correction */
};
④ struct tm
tm结构,这本质上是一个结构体,里面包含了各时间字段。
struct tm { int tm_sec; /* seconds after the minute - [0,59] */ int tm_min; /* minutes after the hour - [0,59] */ int tm_hour; /* hours since midnight - [0,23] */ int tm_mday; /* day of the month - [1,31] */ int tm_mon; /* months since January - [0,11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - [0,6] */ int tm_yday; /* days since January 1 - [0,365] */ int tm_isdst; /* daylight savings time flag */ };
2、函数简介
C语言库函数time.h中的时间函数,能将tm结构转化为time_t类型的时间戳(timestamp),也叫UTC时间,发生错误时返回-1;
发生错误的原因:linux上的man手册显示,如果指定的分解时间不能表示为日历时间(从Epoch开始的秒数),mktime()将返回(time_t) -1,并且不更改分解时间结构的成员。
意思是:当mktime(struct tm *tm)所需要转化的tm结构超出范围限制时,mktime会返回错误值-1。在linux中使用mktime时,多数用来设置RTC时间。笔者在使用mktime时出现-1的情况是没有搞清楚tm结构体中所表示的意义,把tm_year的值设置为当前年份。导致数值溢出发生错误。
3、可能遭遇的坑。
(1)多次调用mktime函数转换出来的小时数出错。
分析原因: mktime在函数内部对传进来的参数struct tm应该有内存申请操作。
解决方法:
① 使用指针作为参数传入
struct tm *tm = NULL;time_t t;time(&t);tm = gmtime(&t);printf(" use gmtime ,the time is :/nyear = %d /nmon = %d /nday = %d /nhour = %d/nmin = %d/nsec = %d/n",tm->tm_year, tm->tm_mon,tm->tm_day,tm->tm_hour,tm->tm_min,tm->tm_sec,);t = mktime(tm); printf("mktime = %lld /n",t);
②在使用之前重新分配内存
time_t t_time = 0;struct tm tm_time = {'\0'};time(&t_time);memset(&tm_time , 0 ,sizeof(tm_time));printf("first t_time = %lld /n",t_time);t_time = mktime(&tm_time);printf("secend mktime_t_time = %d/n",t_time);
(2)使用时返回值为-1
分析原因:传入的struct tm 数据溢出。或者是不符合格式。
解决方法:检查自己传入的参数数据是否溢出,比如年份tm_year 是表示从1900年到目前计时时间间隔多少年。月份是从1月开始计算。
linux系统函数之mktime相关推荐
- Linux系统函数之IO函数
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...
- Linux 系统函数
Linux 系统函数 可以使用 man 2 函数名 查看 系统函数 也可以在 文件内 使用 2+ shift +k 进入指定函数 (前提是光标停在指定函数上) open 函数 int open(con ...
- Linux系统函数read()/write()/pread()/pwrite()的区别
转载地址:https://blog.csdn.net/u013525455/article/details/52661313 在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜 ...
- C库函数与Linux系统函数之间的关系
由上小节知道,C库函数是借助FILE类型的结构体来对文件进行操作的,其本身只是在用户空间(I/O缓冲区)进行读写操作,而数据在内核与用户空间之间的传递.以及将内核与I/O设备之间的数据传递都是该C库函 ...
- linux系统函数 utime,utime函数
#include "apue.h" #include #include int main(int argc,char *argv[] ) { int i,fd; struct st ...
- Linux命令【四】文件+虚拟内存+常用系统函数
File*其实是一个结构体 文件描述符FD:索引到对应的磁盘文件 文件读写位置指针FP_POS,如果同时读写需要注意文件指针的位置 I/O缓冲区BUFFER:保存内存指针,默认大小是8kb,用于减小我 ...
- 【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)
此为牛客网Linux C++课程1.20课程笔记. 1.open函数 open函数有两种,分别是打开一个已经存在的文件和创建并打开一个不存在的文件. #include <sys/types.h& ...
- Linux学习笔记——系统函数IO
文章目录 标准C库IO函数工作流程 标准C库函数与Linux系统函数之间的关系 虚拟地址空间 系统函数IO open read 与 write lseek 标准C库IO函数工作流程 用 fopen 打 ...
- Linux系统编程1——系统函数
文章目录 前言 一.C标准函数与系统函数的区别 1.什么是系统调用 2.文件描述符 3.相关函数 3.1 open函数 3.2 close函数 3.3 read函数 3.4 write函数 3.5 l ...
最新文章
- kafka存储机制与读写流程
- 【报名】杨植麟 :从学习的角度看NLP的现状与未来
- POJ 2255 Tree Recovery(已知前序中序,求后序)
- 使用RemObjects Pascal Script
- 【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]
- 不同库表数据库迁移工具_Microsoft提供的数据库迁移助手工具概述
- python配色方案_python 生成18年写过的博客词云
- Google 网站打不开
- 复制百度文库文字最简单的方法
- 一个简单的姓名生成器
- 苹果系统摩尔庄园是什么服务器,摩尔庄园手游iOS
- 流浪四十年,中国科幻撒点野
- c语言输出王字图形,专一的王子,C语言volatile关键字解析
- 决策树可视化以及数据所要的处理(查漏补缺)
- 使用 Python 脚本执行国密 sm2 加解密
- 微型计算机装机顺序,小伙子,听说你要装机?这款机箱够你玩好多年
- 吴恩达的2022年终盘点:生成式AI、ViT、大模型
- 共享经济:团队共享VS个体共享
- 声明一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)用以对ages 加上years,showage( )用以显示tree对象的ages值。在主函数中定义Tree类对
- 软件设计模式——用Java代码实现物种特征
热门文章
- iOS开发-iPhoneX的适配-iPhoneX屏幕适配分享
- 常见的几种normalization方法
- Scratch 创意游戏(一):弹球游戏
- 银河上半年开放式基金排名:股票型基金
- 用老项目来缅怀下逝去的青春
- 解读Google Analytics(分析)客户端javascript代码
- 二叉搜索树(BST)
- 在html文件中 url是统一资源定位器,什么是URL(统一资源定位器)
- 管道疏通在排管时要注意哪些事项?
- 一个青年,温柔了岁月,惊艳了时光......