先来说说自己在做工程过程中的一些理解:

1, 输入time_t,输出tm格式的函数 loctaltime(time_t) / gmtime(time_t)

  其中localtime会受时区和夏令时影响,也就是说系统会把函数输入的time_t格式的值作为UTC时间,然后根据本地的TZ环境变量,进行小时的偏移得到一个tm格式的时间;

  gmtime则不做环境变量相关的处理,直接获得tm格式的值。

2, 输入tm,输出time_t格式的函数mktime()

  这个函数也受TZ环境变量的影响,确切来说受夏令时标志的影响。如果tm中tm_isdst成员为1,则在做转化时,mk会自动获得程序运行环境的夏令时信息,所以结果受tm成员与夏令时偏移量共同影响。

3, 字符串格式函数ctime(time_t)  asctime(tm)

  将对应的值根据本地时间环境变量打印。

以下摘自于网友的好帖子

系统函数的转化关系如下:

time_t与struct tm之间的转换

struct tm {

int tm_sec;      /*Seconds (0-60)*/

int tm_min;     /*Minites (0-59)*/

int tm_hour;   /*Hours (0-23)*/

int tm_mday;  /*Day of the month (1-31)*/

int tm_mon;   /*Month (1-12)*/

int tm_year;    /*Year since 1900*/

int tm_wday;   /*Day of the week (Sunday = 0)*/

int tm_yday;    /*Day in the year (0-365; 1 Jan = 0)*/

int tm_isdst;    /*Daylight saving time flag > 0: DST is in effect; = 0: DST is not effect; < 0: DST information not available*/
};

结构体tm将日期和时间分解成多个独立的字段,这样能方便程序获取不同的字段值来处理。字段tm_sec的上限为60而不是59,这样的设计主要是考虑闰秒,偶尔用其将人类日历调整至精确的天文年(所谓的回归年)。如果程序中定义了_BSD_SOURCE测试宏,那么有glibc定义的tm结构还会包括两个字段,一个为long int tm_gmtoff,用于表示时间超出UTC以东的秒数,一个为const char* tm_zone,用于表示时区的缩写(例如:CEST为欧洲中部夏令时间)。

gmtime()和localtime()两个函数可将time_t转换成struct tm。gmtime()直接将time_t分解成UTC时间的tm,localtime()需要考虑时区和夏令时的设置,具体声明如下:

#include <time.h>

// Both return a pointer to a statically allocated broker-down time structure on success, or NULL on error

struct tm* gmtime (const time_t *timep);

struct tm* localtime (const time_t *timep);

以上两个函数都是非线程安全的,线程安全版本为gmtime_r()和localtime_r()

mktime()函数可以将struct tm转换成time_t,其声明如下:

time_t mktime (struct tm *timeptr);

该函数可能会修改timeptr对应的值,至少会确保对tm_wday和tm_yday字段的设置,确保这些字段与其他字段能够相互对应起来。同时,mktime()在进行转换时会对时区进行设置。此外,DST设置的使用与否取决于输入字段tm_isdst的值。

  • 若tm_isdst为0,则将这一时间视为标准时间(即,忽略夏令时)
  • 若tm_isdst大于0,则将这一时间视为夏令时
  • 若tm_isdst小于0,则试图判定DST在每年的这一时间是否生效。这往往是众望所归的设置

定义于/usr/share/zoneinfo中。时区的设置会影响到ctime()、localtime()、mktime()、strftime()等函数,为了获取时区设置,这些函数都会调用tzset(3)对如下全局变量进行设置:

char *tzname[2];     /*Name of timezone and alternate (DST) timezone*/

int daylight;            /*Nonzero if there is an alternate (DST) timezone*/

long timezone;       /*Seconds difference between UTC and local standard time*/

Linux系统时间函数的更多相关文章

  1. Unix/Linux系统时间函数API

    首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...

  2. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  3. Linux学习之十-Linux系统时间

    Linux系统时间 1.date命令用于查看以及修改Linux系统的时间,关于date命令的详细帮助文档如下 [root@localhost ~]# date --help Usage: date [ ...

  4. Linux的硬件时间、校正Linux系统时间及系统时间调用流程

    第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时.   ...

  5. linux 系统时间 硬件时间

    Linux时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称RTC).系统时钟是指当前Linux Kernel中的时钟:而硬件时钟则是主板上由电池供电的时钟, ...

  6. [javascript]获取系统时间函数

    var oDate=new Date(); //初始化系统时间函数 alert(oDate.getHours()); //获取时 alert(oDate.getMinutes()); //获取分 al ...

  7. Linux_自动调整linux系统时间和时区与Internet时间同步

    调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# v ...

  8. 修改linux系统时间的方法(date命令)

    修改linux系统时间的方法(date命令) 来源:互联网 作者:佚名 时间:11-18 23:22:27 [大 中 小] date命令不仅可以显示系统当前时间,还可以用它来修改系统时间,下面简单的介 ...

  9. Linux系统时间的设置

    1. Linux系统时间的设置 在Linux中设置系统时间,可以用date命令: //查看时间[root@node1 ~]# dateTue Feb 25 20:15:18 CST 2014//修改时 ...

随机推荐

  1. DataRow对象的RowState和DataRowVersion属性特点

    DataRow对象有两个比较重要的属性,分别是行状态(RowState)和行版本(DataRowVersion),通过这两个属性能够有效的管理表中的行.下面简要的介绍一下行状态和行版本的特点和关系. ...

  2. java程序设计课程实验报告1

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:陈都  学号:20135328 成绩:             指导 ...

  3. OcLint的使用

    一.介绍 OCLint是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析.功能非常强大,而且是出自国人之手.项目地址:http: ...

  4. 旧文备份:CANopen协议中SDO服务

    SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点 ...

  5. Redis内存回收:LRU算法

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...

  6. es6 javascript对象方法Object.assign()

    es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象 ...

  7. [cnBeta]阿里云推出全栈IPv6解决方案 加速推进下一代互联网应用

    https://www.cnbeta.com/articles/tech/795695.htm 访问: 阿里云 - 最高1888元通用代金券立即可用 作为国内首个全面支持IPv6的云厂商,过去5个月, ...

  8. Nginx和Apache区别

    Nginx VS  Apache 相同点: 1.都是HTTP服务器软件 2.功能上都采用模块化结构设计 3.都支持通用的语言接口,如PHP.Perl.Python等 4.支持正向.反向代理.虚拟主机. ...

  9. SpringMVC 之 mvc:exclude-mapping 不拦截某个请求

    在使用 SpringMVC 是,配置了一个 Session 拦截器,用于拦截用户是否登录,但是用户访问登录页面和注册页面时就不需要拦截了,这时就需要用到这个标签了 <mvc:execlude-m ...

  10. 【大数据】MapTask并行度和切片机制

    一. MapTask并行度决定机制 maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度 那么,mapTask并行实例是否越多越好呢?其并行度又是如何决定呢? 1.1 ...