GETTIMEOFDAY - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
gettimeofday,settimeofday-获取/设置时间
语法
#include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
settimeofday():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE
说明
函数gettimeofday()和settimeofday()可以获取和设置时间以及时区。
tv参数是一个struct timeval(如中所指定):
struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };
并给出自历元以来的秒数和微秒数(请参见time(2))。
tz参数是一个结构时区:
struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of DST correction */ };
如果tv或tz为NULL,则不设置或返回相应的结构。 (但是,如果tv为NULL,将产生编译警告。)
时区结构的使用已过时; tz参数通常应指定为NULL。 (请参阅下面的注释。)
在Linux下,如果在第一次调用(引导后)具有非NULL tz参数,tv参数为NULL和tz_minuteswest字段为非零的第一次调用中,则与settimeofday()系统调用相关联的某些特殊的"扭曲时钟"语义。 (在这种情况下,tz_dsttime字段应为零。)在这种情况下,假定CMOS时钟位于本地时间,并且必须增加此数量才能获得UTC系统时间。无疑,使用此功能不是一个好主意。
返回值
gettimeofday()和settimeofday()对于成功返回0,对于失败返回-1(在这种情况下,将errno进行适当设置)。
错误说明
- EFAULT
- 指向可访问地址空间之外的tv或tz之一。
- EINVAL
- (settimeofday()):时区无效。
- EINVAL
- (settimeofday()):tv.tv_sec为负或tv.tv_usec不在[0..999,999]范围内。
- EINVAL(since Linux 4.3)
- (settimeofday()):尝试将时间设置为小于CLOCK_MONOTONIC时钟的当前值的值(请参见clock_gettime(2))。
- EPERM
- 调用过程没有足够的特权来调用settimeofday();。在Linux下,需要CAP_SYS_TIME功能。
遵循规范
SVr4、4.3BSD。 POSIX.1-2001描述了gettimeofday()而不是settimeofday()。 POSIX.1-2008将gettimeofday()标记为已过时,建议改为使用clock_gettime(2)。
备注
gettimeofday()返回的时间受系统时间的不连续跳跃影响(例如,如果系统管理员手动更改系统时间)。如果需要单调增加的时钟,请参见clock_gettime(2)。
用于timeval结构的宏在timeradd(3)中进行了描述。
传统上,struct timeval的字段是long类型的。
C library/kernel differences
在某些体系结构上,vdso(7)中提供了gettimeofday()的实现。
The tz_dsttime field
在具有glibc的非Linux内核上,如果当前时区曾经或将应用夏令时,则通过gettimeofday()将struct timezone的tz_dsttime字段设置为非零值。从这个意义上讲,它恰好反映了当前区域的daylight(3)的含义。在Linux上,使用glibc,settimeofday()或gettimeofday()从未使用过struct timezone的tz_dsttime字段的设置。因此,以下内容纯粹具有历史意义。
在旧系统上,字段tz_dsttime包含一个符号常量(值在下面给出),该符号常量指示夏令时在一年的哪部分生效。 (注意:此值在一年中是恒定的:它并不表示DST生效,它只是选择一种算法。)定义的夏时制算法如下:
DST_NONE /* not on DST */ DST_USA /* USA style DST */ DST_AUST /* Australian style DST */ DST_WET /* Western European DST */ DST_MET /* Middle European DST */ DST_EET /* Eastern European DST */ DST_CAN /* Canada */ DST_GB /* Great Britain and Eire */ DST_RUM /* Romania */ DST_TUR /* Turkey */ DST_AUSTALT /* Australian style with shift in 1986 */
当然,事实证明,不能通过一种简单的算法(每个国家/地区指定一个时间)来指定夏令时的有效期。实际上,这一时期是由不可预测的政治决定所决定的。因此,这种表示时区的方法已被放弃。
另外参见
date(1),adjtimex(2),clock_gettime(2),time(2),ctime(3),ftime(3),timeradd(3),capabilities(7),time(7),vdso(7), hwclock(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。