Linux系统时间函数

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

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*/

时间: 2024-08-29 01:39:44

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

Unix/Linux系统时间函数API

首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时:地球一年中自转的速度并不是恒定的,它有时候转的快,有时候转的慢,地震可能使得地球自转加快,而发射卫星则使得自转减缓,但地球的总体自转趋势是越来越慢.如果按照地球自转一圈固定为24小时来定义时间长度,会导致一秒钟的长度不稳定,或长或短.为解决这个问题,科研人员发现某元素的原子运动频率很稳定,可以以该元

Linux系统时间和硬件时间设置

在Linux中有硬件时钟与系统时钟两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.所有Linux相关指令与函数都是读取系统时钟的设定.因为存在两种不同的时钟,那么它们之间就会存在差异.当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作. 用date命令对系统时间进行设置后,并不会去修改硬件时钟,所以系统重启后,系统时间还算会去读取硬件时间,这就是为何date设置失效到原因. 因此,需要在设置系统时间后,将

linux中时间函数

linux下常用时间类型有四种: time_t . struct   tm. struct  timeval .    struct   timespec 1.time_t   时间函数 time_t  类型在time.h中定义: #ifndef   __TIME__T #define  __TIME_T typedef    long  time_t #endif 可见, time_t 实际上是一个长整型,其值表示从1970年1月1日00时00分00秒(linux系统的Epoch时间)到当前时

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

调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# vi /etc/sysconfig/clockZONE="Asia/Shanghai"UTC=falseARC=false 二.配置新的时间日期设定:# date -s 2008/05/06 时间设定:# date -s 18:40:00 查看硬件时间(BIOS的):    hwclock

Linux系统时间管理

一.时区配置 显示时区 [[email protected] ~]# date -R Mon, 19 Dec 2016 14:02:47 +0800 [[email protected] ~]# [[email protected] ~]# date +%z +0800 [[email protected] ~]# 主要就是后面的+0800,东八区 修改时区 [[email protected] ~]# vim /etc/sysconfig/clock [[email protected] ~]

linux系统时间修改及同步

时间修改date 月日时分年.秒date -s可以直接设置系统时间 比如将系统时间设定成1996年6月10日的命令如下.#date -s 06/10/96将系统时间设定成下午1点12分0秒的命令如下.#date -s 13:12:00时间同步1.首先需了解linux内一任务计划工具crontab crontab可以定时去执行你要做的动作 直接用crontab命令编辑crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数crontab -l //列出某

调整linux系统时间和时区

一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# vi /etc/sysconfig/clockZONE="Asia/Shanghai"UTC=falseARC=false 二.配置新的时间日期设定:# date -s 2008/05/06 时间设定:# date -s 18:40:00 查看硬件时间(BIOS的):    hwclock [-rw]     -r:查看现有BIOS时间,默认为-

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

修改linux系统时间的方法(date命令) 来源:互联网 作者:佚名 时间:11-18 23:22:27 [大 中 小] date命令不仅可以显示系统当前时间,还可以用它来修改系统时间,下面简单的介绍下,方便需要的朋友 命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改日期和时间 date -s "2012-05-18 04:53:00"

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

调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# vi /etc/sysconfig/clockZONE="Asia/Shanghai"UTC=falseARC=false 二.配置新的时间日期设定:# date -s 2008/05/06 时间设定:# date -s 18:40:00 查看硬件时间(BIOS的):    hwclock