Linux时间函数

2023-05-16

系统环境:ubuntu10.04

简介
本文旨在为了解Linux各种时间类型与时间函数提供技术文档。

1、Linux下常用时间类型
Linux下常用时间类型有四种:time_tstruct tmstruct timevalstruct timespec

1.1 time_t时间类型
time_t类型在time.h中定义:
#ifndef __TIME_T
#define __TIME_T
typedef  long  time_t;
#endif
可见,time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间197011000000(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038119031407秒(UTC)。为了能够表示更久远的时间,可用64或更长的整形数来保存日历时间,这里不作详述。
使用time()函数获取当前时间的time_t值,使用ctime()函数将time_t转为当地时间字符串。

备注UTC时间有时也称为GMT时间,其实UTCGMT两者几乎是同一概念。它们都是指格林尼治标准时间,只不过UTC的称呼更为正式一点。两者区别在于前者是天文上的概念,而后者是基于一个原子钟。

1.2 struct tm时间类型
tm结构在time.h中定义:
#ifndef _TM_DEFINED
struct tm{
    int tm_sec; /*秒 - 取值区间为[0, 59]*/
    int tm_min; /*分 - 取值区间为[0, 59]*/
    int tm_hour; /*时 - 取值区间为[0, 23]*/
    int tm_mday; /*日 - 取值区间为[1, 31]*/
    int tm_mon; /*月份 - 取值区间为[0, 11]*/
    int tm_year; /*年份 - 其值为1900年至今年数*/
    int tm_wday; /*星期 - 取值区间[0, 6],0代表星期天,1代表星期1,以此类推*/
    int tm_yday; /*从每年的1月1日开始的天数-取值区间为[0, 365],0代表1月1日*/
    int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/
};
#define _TM_DEFINED
#endif
ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)
使用gmtime( )localtime( )可将time_t时间类型转换为tm结构体;

使用mktime( )tm结构体转换为time_t时间类型;
使用asctime( )struct tm转换为字符串形式。
 
1.3 struct timeval时间类型
timeval结构体在time.h中定义:
Struct tmieval{
    time_t tv_sec; /*秒s*/
    suseconds_t tv_usec; /*微秒us*/
};
设置时间函数settimeofday( )与获取时间函数gettimeofday( )均使用该事件类型作为传参。
 
1.4 struct timespec时间类型
timespec结构体在time.h定义:
struct timespec{
    time_t tv_sec; /*秒s*/
    long tv_nsec; /*纳秒ns*/
};
 
2、Linux下常用时间函数
Linux下常用时间函数有:time( )ctime( )gmtime( )localtime( )mktime( )asctime( )difftime( )gettimeofday( )settimeofday( )

2.1 time( )函数
头文件:#include <time.h>
函数定义:time_t time(time_t *timer)
功能描述:该函数返回从197011000000秒至今所经过的秒数。如果time_t *timer非空指针,函数也会将返回值存到timer指针指向的内存。
返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
例:
time_t seconds;
seconds = time((time_t *)NULL);

2.2 ctime( )函数
头文件:#include <time.h>
函数定义:char *ctime(const time_t *timep);
功能描述:ctime( )将参数timep指向的time_t时间信息转换成实际所使用的时间日期表示方法,并以字符串形式返回。字符串格式为:"Wed Jun 20 21:00:00 2012\n"
例:
time_t timep;
tmep = time(NULL);
printf("%s\n", ctime(&timep));

2.3 gmtime( )函数
头文件:#include <time.h>
函数定义:struct tm *gmtime(const time_t *timep)
功能描述:gmtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的GMT时间信息,并以struct tm*指针返回。
GMTGMT是中央时区, 北京 在东8,相差8个小时,所以北京时间=GMT时间+8小时
例:
int main(void)
{
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p_tm;
    timep = time(NULL);
    p_tm = gmtime(&timep); /*获取GMT时间*/
    printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);
    printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);
}

2.4 localtime( )函数
头文件:#include <time.h>
函数定义:struct tm *localtime(const time_t *timep);
功能描述:localtime( )将参数timep指向的time_t时间信息转换成以tm结构体表示的本地时区时间(如北京时间= GMT+小时)
例:
int main(void)
{
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p_tm;
    timep = time(NULL);
    p_tm = localtime(&timep); /*获取本地时区时间*/
    printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);
    printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);
    return 0;
}

2.5 mktime( )函数
头文件:#include <time.h>
函数定义:time_t mktime(struct tm *p_tm);
功能描述:mktime( )将参数p_tm指向的tm结构体数据转换成从197011000000秒至今的GMT时间经过的秒数。
例:
int main(void)
{
    time_t timep:
    struct tm *p_tm;
    timep = time(NULL);
    pintf("time( ):%d\n", timep);
    p_tm = local(&timep);
    timep = mktime(p_tm);
    printf("time( )->localtime( )->mktime( ):%d\n", timep);
    return 0;
}

2.6 asctime( )函数
头文件:#include <time.h>
函数定义:char *asctime(const struct tm *p_tm);
功能描述:asctime( )将参数p_tm指向的tm结构体数据转换成实际使用的时间日期表示方法,并以字符串形式返回(ctime函数相同)。字符串格式为:"Wed Jun 20 21:00:00 2012\n"
例:
int main(void)
{
    time_t timep;
    timep = time(NULL);
    printf("%s\n", asctime(gmtime(&timep)));
    return 0;
}

2.7 difftime( )函数
头文件:#include <time.h>
函数定义:double difftime(time_t timep1, time_t timep2);
功能描述:difftime( )比较参数timep1timep2时间是否相同,并返回之间相差秒数。
例:
int main(void)
{
    time_t timep1, timep2;
    timep1 = time(NULL);
    sleep(2);
    timep2 = time(NULL);
    printf("the difference is %f seconds\n", difftime(timep1, timep2));
    return 0;
}

2.8 gettimeofday( )函数
头文件:#include <sys/time.h>
        #include <unistd.h>
函数定义:int gettimeofday(struct timeval *tv, struct timezone *tz);
功能描述:gettimeofday( )把目前的时间信息存入tv指向的结构体,当地时区信息则放到tz指向的结构体。
struct timezone原型:
struct timezone{
    int tz_minuteswest; /*miniutes west of Greenwich*/
    int tz_dsttime; /*type of DST correction*/
};
例:
struct timeval tv;
struct timeval tz;
gettimeofday(&tv, &tz);

附:
使用time函数族获取时间并输出指定格式字符串例子(strftime( )函数):
int main(void)
{
    char strtime[20] = {0};
    time_t timep;
    struct tm *p_tm;
    timep = time(NULL);
    p_tm = localtime(&timep);
    strftime(strtime, sizeof(strtime), "%Y-%m-%d %H:%M:%S", p_tm);
    return 0;
}

2.9 settimeofday( )函数
头文件:#include <sys/time.h>
        #include <unistd.h>
函数定义:int settimeofday(const struct timeval *tv, const struct timezone *gz);
功能描述:settimeofday( )把当前时间设成由tv指向的结构体数据。当前地区信息则设成tz指向的结构体数据。
例:
int main(void)
{
    char t_string[] = "2012-04-28 22:30:00";
    struct tm time_tm;
    struct timeval time_tv;
    time_t timep;
    int ret = 0;

    sscanf(t_string, "%d-%d-%d %d:%d:%d", &time_tm.tm_year, &time_tm.tm_mon, &time_tm.tm_mday, &time_tm.tm_hour, &time_tm.tm_min, &time_tm.tm_sec);
    time_tm.tm_year -= 1900;
    time_tm.tm_mon -= 1;
    time_tm.tm_wday = 0;
    time_tm.tm_yday = 0;
    time_tm.tm_isdst = 0;

    timep = mktime(&time_tm);
    time_tv.tv_sec = timep;
    time_tv.tv_usec = 0;

    ret = settimeofday(&time_tv, NULL);
    if(ret != 0)
    {
        fprintf(stderr, "settimeofday failed\n");
        return -1;
    }
    return 0;
}

参考资料:
http://blog.csdn.net/c395565746c/article/details/6621153
http://fanqiang.chinaunix.net/a4/b8/20010527/201001267.html
http://qgjie456.blog.163.com/blog/static/35451367200844102949365/
http://hi.baidu.com/wangzhongli/blog/item/e260b3a1f388278746106461.html
http://www.eefocus.com/xuefu2009/blog/10-03/187348_f456a.html
http://www.instructables.com/id/EMLW5UGI26MZLAY/2014-11-08
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux时间函数 的相关文章

  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L

随机推荐

  • LINUX笔记

    1 按条件删除 删除30分钟前的文件 find type f mmin 43 30 xargs rm f
  • Spring管理hibernateTemplate进行写入操作报只读异常

    异常描述 xff1a 此异常出现在web页面 xff0c 在后台没有报 Write operations are not allowed in read only mode FlushMode NEVER MANUAL Turn your
  • Spring 产生SessionFactory,使用c3p0配置数据源相关配置

    1 首先要引入c3p0包和支持包 xff0c 在hibernate的lib有个optional目录 xff0c 里面有需要的包 2 配置driverClass等相关属性 xff0c 注意 xff1a property里面的name值不可乱写
  • 笔记本单/双网卡如何同时上内外网

    一些公司是只有内网没有外网的 xff0c 如果要上内网的同时上外网 xff0c 比如连WiFi xff0c 如何配置 xff1f 单网卡 win 43 R 进入输入cmd 进入控制台 xff0c 输入ipconfig查看内外网的ip信息 x
  • go 实现快速排序

    一 点睛 快速排序 xff08 Quicksort xff09 是对冒泡排序的一种改进 基本思想是 xff1a 通过一趟排序将要排序的数据分割成独立的两部分 xff0c 其中一部分的所有数据都比另外一部分的所有数据都要小 xff0c 然后再
  • Chrome浏览器无法加载已解压的.crx文件的解决办法

    1 找到crx文件 xff0c 将 crx文件后缀名改为zip 并解压成文件夹 2 在扩展程序页面点击加载已解压的扩展程序 选择上面解压的文件夹 点击确定即可安装完成
  • 软件测试模型与软件测试流程5个阶段(重)

    软件测试流程 xff1a 需求分析阶段 软件设计和编码阶段 xff08 进行单元测试 xff09 集成 系统 验收测试阶段 软件测试模型 xff1a 传统 xff1a 项目计划 需求分析 软件设计 程序开发 软件测试 集成维护 V模型 xf
  • Android Studio如何卸载干净?

    想要卸载Android Studio xff1f 跟着步骤做 xff0c 还愁卸载不干净 xff1f 1 卸载前 xff0c 一定要把Android Studio退出 xff0c 接着打开 控制面板 卸载程序 Android Studio
  • 观华为模拟面试大赛有感

    1 面试注重个人收获与自我提升 xff0c 工作注重整体利益 2 遇到问题先从自身寻找问题 xff0c 努力沟通并解决 3 稳 回答问题先思考一会儿 xff0c 不要急躁 狠 xff1a 一语中的 xff0c 切中要害 xff0c 简洁有力
  • linux关于消息队列中消息的大小的限制

    在消息队列中 xff0c 例如函数msgsnd int msqid const void msgp size t msgsz int msgflg 这个函数调用的时候 xff0c msgsz最大只能为8192 xff0c 也就是2的16次方
  • MySQL事务隔离级别详解

    MySQL事务隔离级别详解 SQL标准定义了4类隔离级别 xff0c 包括了一些具体规则 xff0c 用来限定事务内外的哪些改变是可见的 xff0c 哪些是不可见的 低级别的隔离级一般支持更高的并发处理 xff0c 并拥有更低的系统开销 R
  • php 发送与接收流文件

    php 发送与接收流文件 sendStreamFile php 把文件以流的形式发送 receiveStreamFile php 接收流文件并保存到本地 sendStreamFile php lt php php 发送流文件 64 para
  • php 上传图片保存到数据库例子

    php 上传图片保存到数据库例子 php 上传图片 xff0c 一般都使用move uploaded file 方法保存在服务器上 但如果一个网站有多台服务器 xff0c 就需要把图片发布到所有的服务器上才能正常使用 xff08 使用图片服
  • 结构体最后的长度为0或1数组的作用(转载)

    其实很早在看LINUX下就看到这个东西 xff0c 后来在MFC内存池里同样也看到了类似的东西 xff0c 还依照MFC写过一个类似的小内存池 xff0c xff08 MFC用的是return this 43 1 xff09 后来在李先静的
  • chmod 755和chmod 4755的区别

    chmod 755和chmod 4755的区别 from xff1a http hi baidu com angivo blog item d679237e467f68320dd7da10 html chmod是Linux下设置文件权限的命
  • spring的依赖注入

    一 点睛 控制反转和依赖注入在Spring环境下是等同的概念 xff0c 控制反转是通过依赖注入实现的 所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系 xff0c 而不是通过对象本身负责自己的创建和解决自己的依赖 依赖注入的主要目
  • VxWorks网络编程

    vxworks实现了与BSD4 4 TCP IP兼容的网络协议栈 xff0c 并且其实时性 较之有很大提高 xff0c 这使得基于BSD4 4 UNIX Socket的应用程序可以很方便地移植到vxworks中去 1 1vxworks网络组
  • su: must be suid to work properly错误

    内核 linux2 6 21 文件系统 busybox1 19 2 yaffs2 开发板 xff1a loongson 1b 嵌入式文件系统一般用户执行su root切换根用户提示错误 xff1a su must be suid to wo
  • Tslib移植与分析

    目标平台 xff1a LOONGSON 1B开发板 xff08 mips32指令集 xff09 编译平台 xff1a x86PC VMware6 5 Ubuntu10 04 xff08 下面简称 ubuntu系统 xff09 或 xff1a
  • Linux时间函数

    系统环境 xff1a ubuntu10 04 简介 本文旨在为了解Linux 各种时间类型与时间函数提供技术文档 1 Linux下常用时间类型 Linux下常用时间类型有四种 xff1a time t struct tm struct ti