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,并且不更改分解时间结构的成员。

意思是:当mktimestruct 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相关推荐

  1. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  2. Linux 系统函数

    Linux 系统函数 可以使用 man 2 函数名 查看 系统函数 也可以在 文件内 使用 2+ shift +k 进入指定函数 (前提是光标停在指定函数上) open 函数 int open(con ...

  3. Linux系统函数read()/write()/pread()/pwrite()的区别

    转载地址:https://blog.csdn.net/u013525455/article/details/52661313 在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜 ...

  4. C库函数与Linux系统函数之间的关系

    由上小节知道,C库函数是借助FILE类型的结构体来对文件进行操作的,其本身只是在用户空间(I/O缓冲区)进行读写操作,而数据在内核与用户空间之间的传递.以及将内核与I/O设备之间的数据传递都是该C库函 ...

  5. linux系统函数 utime,utime函数

    #include "apue.h" #include #include int main(int argc,char *argv[] ) { int i,fd; struct st ...

  6. Linux命令【四】文件+虚拟内存+常用系统函数

    File*其实是一个结构体 文件描述符FD:索引到对应的磁盘文件 文件读写位置指针FP_POS,如果同时读写需要注意文件指针的位置 I/O缓冲区BUFFER:保存内存指针,默认大小是8kb,用于减小我 ...

  7. 【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

    此为牛客网Linux C++课程1.20课程笔记. 1.open函数 open函数有两种,分别是打开一个已经存在的文件和创建并打开一个不存在的文件. #include <sys/types.h& ...

  8. Linux学习笔记——系统函数IO

    文章目录 标准C库IO函数工作流程 标准C库函数与Linux系统函数之间的关系 虚拟地址空间 系统函数IO open read 与 write lseek 标准C库IO函数工作流程 用 fopen 打 ...

  9. Linux系统编程1——系统函数

    文章目录 前言 一.C标准函数与系统函数的区别 1.什么是系统调用 2.文件描述符 3.相关函数 3.1 open函数 3.2 close函数 3.3 read函数 3.4 write函数 3.5 l ...

最新文章

  1. kafka存储机制与读写流程
  2. 【报名】杨植麟 :从学习的角度看NLP的现状与未来
  3. POJ 2255 Tree Recovery(已知前序中序,求后序)
  4. 使用RemObjects Pascal Script
  5. 【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]
  6. 不同库表数据库迁移工具_Microsoft提供的数据库迁移助手工具概述
  7. python配色方案_python 生成18年写过的博客词云
  8. Google 网站打不开
  9. 复制百度文库文字最简单的方法
  10. 一个简单的姓名生成器
  11. 苹果系统摩尔庄园是什么服务器,摩尔庄园手游iOS
  12. 流浪四十年,中国科幻撒点野
  13. c语言输出王字图形,专一的王子,C语言volatile关键字解析
  14. 决策树可视化以及数据所要的处理(查漏补缺)
  15. 使用 Python 脚本执行国密 sm2 加解密
  16. 微型计算机装机顺序,小伙子,听说你要装机?这款机箱够你玩好多年
  17. 吴恩达的2022年终盘点:生成式AI、ViT、大模型
  18. 共享经济:团队共享VS个体共享
  19. 声明一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)用以对ages 加上years,showage( )用以显示tree对象的ages值。在主函数中定义Tree类对
  20. 软件设计模式——用Java代码实现物种特征

热门文章

  1. iOS开发-iPhoneX的适配-iPhoneX屏幕适配分享
  2. 常见的几种normalization方法
  3. Scratch 创意游戏(一):弹球游戏
  4. 银河上半年开放式基金排名:股票型基金
  5. 用老项目来缅怀下逝去的青春
  6. 解读Google Analytics(分析)客户端javascript代码
  7. 二叉搜索树(BST)
  8. 在html文件中 url是统一资源定位器,什么是URL(统一资源定位器)
  9. 管道疏通在排管时要注意哪些事项?
  10. 一个青年,温柔了岁月,惊艳了时光......