linux中的时间函数
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
time_t the_time;
for(i = 1; i <= 10; i++) {
the_time = time((time_t *)0);
printf(“The time is %ld\n”, the_time);
“%a %b %d %H:%M:%S %Y”
为了有助于读取日期,我们可以使用 strptime 函数,这个函数会将一个表示日期与时间的字 符串作为参数,并且创建一个表示同样日期与时间 tm 结构:
#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *timeptr);
tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday); printf(“time: %02d:%02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); exit(0); } 当我们运行这个程序时,我们会得到更可读的时间与日期值: $ ./gmtime; date Raw time is 1044696004 gmtime gives: date: 103/02/08 time: 09:20:04 Sat Feb 8 09:20:04 GMT 2003 工作原理 这个程序调用 time 函数得到一个底层的时间值,然后调用 gmtime 将其转换为一个具有时 间 与日期值的结构。程序会使用 printf 函数打印输出。严格来讲,我们不应使用这种方式打印原始 时间,因为并不能保证在所有的系统他都是一个 long 类 型。在 gmtime 函数之后,我们立即运行 date 命令来比较其输出。 然而,在这里我们一个小问题。如果我们在一个不使用格林尼治时间的时区运行这个程序,或 者是 我们本地的白天存储时间是有效的(问题?),我们就会注意到这个时间并不正确。这是因为 gmtime 是使用 GMT 返回时间。Linux 与 Unix 系统这样 做,从而世界上的程序与系统都是同步的。 不同时区在同一时间创建的文件会显示出具有相同的创建时间。要查看本地时间,我们需要使用 localtime 函数 来代替。 #include <time.h> struct tm *localtime(const time_t *timeval);
tm 结构的定义至少包含下列成员:
成员
描述
int tm_sec 秒,0-61
int tm_min 分,0-59
int tm_hour 时,0-23
int tm_mday 一月中的天,1-31
int tm_mon 一年中的月,0-11(一月为 0)
int tm_year 由 1900 年起的年数
int tm_wday 一星期中的天,0-6(星期日为 0)
time_t timeval; (void)time(&timeval); printf(“The date is: %s”, ctime(&timeval));
-5-
exit(0);
}
将其保存为 ctim.c,编译运行,我们应可以看到下面的输出:
$ ./ctime
The date is: Sat Feb strftime 的格式化字符串完全相同。strptime 的动作形为与 sscanf 相似,因为他们都搜索字符串,查找标识的域,然后将他 们写入变量。在这里的变量为依据格式 化字符串要填充的 tm 结构的成员。然而,与 strftime 的转义字符比起来,strptime 的转义字符 是不严密 的,因为 strptime 会在天与月上允许简写与全名两种形式。每一个表示都会匹配 strptime 中的一个%a 说明符。strftime 总是在小于 10 的数字上添加 0,而 strptime 会将其看作 可选的。
时间是使用一个定义的 time_t 类型来处理。这是一个足够大的整数类型来包含以秒计的日期 与时间值。在 Linux 系统上,他是一个长整数,其定义以及相关的操作函数都定义在头文件 time.h 中。
不要认为时间是 32 位的。在 Unix 以及 Linux 系统上使用一个 32 位的 time_t 类型,而这个时 间会在 2038 年重叠。到那时,我们希望这些系统都使用一个大于 32 位的 time_t 类型。
-1-
sleep(2); } exit(0); } 当我们运行这个程序时,他会每隔 2 秒打印出底层时间值。 $ ./envtime The time is 1044695820 The time is 1044695822 The time is 1044695824 The time is 1044695826 The time is 1044695828 The time is 1044695830 The time is 1044695832 The time is 1044695834 The time is 1044695836 The time is 1044695838 工作原理 这个程序使用一个空指针参数来调用 time 函数,这个函数会返回以秒计的时间与日期值。程 序会休眠 2 秒,并且重复调用 time 函数 10 次。 使用由 1970 年开始的以秒计的时间与日期值对于估量某件事持续多少时间是十分有用的。我 们 只需要简单的使用两个由 time 调用得到的时间进行减法操作即可。然而结过仔细的考虑, ISO/ANSIC C 标准委员会并没有说时 time_t 类型要用于计量以秒计的时间间隔值,所以他们开发 了一个函数,difftime,这个函数会计算两个 time_t 值之 间的间隔,并且返回一个 double 类型: #include <time.h> double difftime(time_t time1, time_t time2); difftime 函数计算两个时间值之间的间隔,并且返回 time1-time2 的浮点值。对于 Linux 系 统而言,由 time 返回的值是秒数,并且可以进行操作,但是为了移植考虑,我们应使用 difftime 函数。
-4-
localtime 函数与 gmtime 相同,所不同的是他会返回一个包含为本地时区进行过调整后的结 构。如果我们再次试验 gmtime 程序,但是使用 localtime 函数来替换 gmtime,我们就会看到一个 正确的时间与日期报告。
要将一个打乱的 tm 结构转换为一个原始的 time_t 值,我们可以使用 mktime 函数: #include <time.h> time_t mktime(struct tm *timeptr); 如果结构不可以表示为一个 time_t 值,mktime 函数会返回-1。 与 date 程序所提供的时间与日期等机器值相反,为了友好,我们可以使用 asctime 与 ctime 函数: #include <time.h> char *asctime(const struct tm *timeptr); char *ctime(const time_t *timeval); asctime 函数返回一个代表 tm 结构 timeptr 给出的时间与日期的字符串。返回的字符串的格 式如下: Sun Jun 6 12:30:34 1999\n\0 他总是 26 个字符长的固定格式。函数 ctime 与下面的函数调用等同: asctime(localtime(timeval)) 他使用一个原始时间值作为参数,并将其转换为一个更可读的本地时间。 试验--ctime 让我们使用下面的代码来实际的看一下 ctime: #include <time.h> #include <stdio.h> int main() {
转义符
描述
%a
简写的星期名
%A
全写的星期名
%b
简写的月名
%B
全写的月名
%c
日期与时间
%d
一月中的天,01-31
%H
时,00-23
%I
12 小时时钟表示的小时,01-12
%j
一年中的天,001-366
%m
一年中的月,01-12
%M
分,00-59
-6-
%P
a.m 或 p.m
%S
秒,00-61
%u
星期中的天,1-7(星期 1 为 1)
#include <time.h>
time_t time(time_t *tloc);
我们可以调用 time 函数来得到一个底层的时间值,这个函数会返回由纪元起点开始的秒数。 如果 tloc 不为空指针,函数就会将返回值写入 tloc 所指的变量中。
试验--时间
这里是一个简单的时间程序,envtime.c,来演示 time 函数:
#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);
strftime 函数会格式化由 timeptr 指向的 tm 结构表示的时间与日期,并将其结构放在字符串 s 中。字符串被指明至少 maxsize 字符长。format 字符串用 来控制写入字符串的字符。与 printf 相似,他包含要传递到字符串的通常字符与格式化时间与日期元素的转义说明。转义说明包括:
-2-
为了以更为有意义的方式来表示时间与日期,我们需要将时间值转换为可以识别的时间与日 期。这有标准的函数可以帮助我们做到。