ctime , localtime , gmtime , mktime , difftime , asctime 或 tzset 子例程
用途
转换日期和时间表示的格式。
库
标准 C 库 (libc.a)
语法
#include <time.h> const time_t *Clock;
struct tm *localtime (Clock)
const time_t *Clock; struct tm *gmtime (Clock)
const time_t *Clock; struct tm *Timeptr;
const struct tm *Tm;
void tzset ( )
extern long int timezone;
extern int daylight;
extern char *tzname[];描述
注意: 与 libc.a 和 libbsd.a链接时,请勿使用 tzset 子例程。 tzset 子例程设置名为 timezone的全局外部变量,这与 libbsd.a中的 timezone 子例程冲突。 此名称冲突可能导致不可预测的结果。
注意: 请勿使用 ctime, localtime, gmtime和 或多线程环境中的 asctime 子例程。 请参阅 ctime_r, localtime_r, gmtime_r或 asctime_r 子例程文章中的多线程替代方法。
ctime 子例程将 Clock 参数指向的时间值 (表示自 00:00:00 全球标准时间 (UTC) , 1970 年 1 月 1 以来的时间 (以秒为单位)) 转换为以下格式的 26 个字符的字符串:
Sun Sept 16 01:03:52 1973\n\0 每个字段的宽度始终与此处所示相同。
ctime 子例程调整时区和夏令时 (如果它生效)。
localtime 子例程将 Clock 参数所指向的长整数转换为 tm 结构,该参数包含自 1970 年 1 月 00:00:00 UTC 以来的时间 (以秒为单位)。 localtime 子例程调整时区和夏令时 (如果它生效)。 使用时区信息,就像 localtime 称为 tzset一样。
gmtime 子例程将 Clock 参数指向的长整数转换为包含全球标准时间 (UTC) 的 tm 结构,这是操作系统使用的时间标准。
tm 结构在 time.h 文件中定义,它包含以下成员:
int tm_sec; /* Seconds (0 - 59) */
int tm_min; /* Minutes (0 - 59) */
int tm_hour; /* Hours (0 - 23) */
int tm_mday; /* Day of month (1 - 31) */
int tm_mon; /* Month of year (0 - 11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of week (Sunday = 0) */
int tm_yday; /* Day of year (0 - 365) */
int tm_isdst; /* Nonzero = Daylight saving time */ mktime 子例程是 localtime 子例程的反向函数。 mktime 子例程将 tm 结构转换为自 1970 年 1 月 00:00:00 UTC 以来的时间 (以秒为单位)。1 该tm_wday和tm_yday将忽略字段,并且不会将 tm 结构的其他组件限制为 /usr/include/time.h 文件中指定的范围。 值tm_isdst字段确定 mktime 子例程的下列操作:
| 项 | 描述 |
|---|---|
| 重大安全事件数量 | 最初假定夏令时 (DST) 未生效。 |
| > 0 | 最初假定 DST 生效。 |
| -1 | 主动确定 DST 是否在指定时间和本地时区生效。 本地时区信息由 tzset 子例程设置。 |
成功完成时, mktime 子例程将设置tm_wday和tm_yday字段。 其他字段设置为表示自 1970 年 1 月 1 以来的指定时间。 但是,这些值将强制为 /usr/include/time.h 文件中指定的范围。 终值tm_mday未设置字段,直到该字段的值tm_mon和tm_year字段。
difftime 子例程计算两个日历时间之间的差异: Time1 和 -Time0 参数。
asctime 子例程将 tm 结构转换为与 ctime格式相同的 26 个字符的字符串。
如果定义了 TZ 环境变量,那么其值将覆盖缺省时区,即 U.S。 东部时区。 environment 工具包含由 TZ指定的时区信息的格式。当使用 /etc/environment 或 /etc/profile 文件中定义的值启动系统时,通常会设置 TZ 。 但是,用户也可以将其设置为用于执行备用时区转换的常规环境变量。
tzset 子例程设置 timezone, daylight和 tzname 外部变量以反映 TZ的设置。 tzset 子例程由 ctime 和 localtime调用,也可以由应用程序显式调用。
timezone 外部变量包含 UTC 与本地标准时间之间的差值 (以秒计)。 例如,对于 U.S, timezone 的值为 5 * 60 * 60。 东部标准时间。
应应用夏令时转换时, daylight 外部变量非零。 缺省情况下,此转换遵循标准 U.S约定; 可以指定其他约定。 缺省转换算法根据 1974 年和 1975 年的 U.S. 夏令时的特殊性进行调整。
tzname 外部变量包含标准时区 (tzname [0]) 的名称以及在 "夏令时" 生效时时区的名称 (tzname [1])。 例如:
char *tzname[2] = {"EST", "EDT"}; time.h 文件包含所有这些子例程和外部以及 tm 结构的声明。
参数
| 项 | 描述 |
|---|---|
| 时钟 | 指定指向时间值的指针 (以秒为单位)。 |
| 时间 (Timeptr) | 指定指向 tm 结构的指针。 |
| Time1 | 指定指向 time_t 结构的指针。 |
| Time0 | 指定指向 time_t 结构的指针。 |
| Tm | 指定指向 tm 结构的指针。 |
返回值
注意: 返回值指向每个调用覆盖的静态数据。
tzset 子例程不返回任何值。
mktime 子例程返回编码为 time_t类型的值的指定时间 (以秒为单位)。 如果无法表示时间,那么此函数将返回值 (time_t) -1。
localtime 和 gmtime 子例程返回指向 struct tm的指针。
ctime 和 asctime 子例程返回一个指向 26 个字符的字符串的指针。
difftime 子例程返回以秒表示的差值,作为类型为 double的值。