在计算机的硬件中包含一个系统时钟,系统引导的时候读取该时钟,然后维持它自己的时钟计数器,利用时钟计数器对系统内的事件,如文件的创建或用户登录等给出时间记录。时钟值也可以利用time()系统调用供你自己的程序使用:
#include <sys/types/h>
#include (time.h>
time_t time(time_t *loc);
这个系统调用返回一个time_t值,如果参数loc是指向这种类型的变量的指针,则返回值也被拷贝到这个指针所指的变量中。
数据类型time_t实际上由typedef定义,可以通过<time.h>访问,它的基本">数据类型是long。因此time()系统调用返回一个长型整数作为当前时钟的时间值,但是,这是一种奇怪格式,即从格林威治时间1970年1月1日午夜起所经过的秒数(我假定这个时钟必定在某一时刻开始...)。
有一个枝节问题是:它用一个长型整数可以记录多长时间?如果限制在32位长的正整数范围内(负值对时间没有任何意义!),则它刚好超过68年,或者说直到2038年初(还有充裕的时间想一个替代办法)。
这种时间格式实际上相当有用,如果你想要解决两个事件之间(例如你的登录时间和退出系统的时间)经过了多长时间,你只要从较早时间减去较晚时间就得到两个事件之间的秒数。
但是,在你想要显示日,月年或者当天的时间的情况下,这种时间格式就不太方便。为了简化这些操作,标准库中包含一些有用的函数为你进行转换。两个这样的函数是:
#include <time.h>
struct tm *gmtime(time_t *loc);
struct tm *localtime(time_t *loc);
这两个函数都取一个参数loc,它是指向包含‘自1970年以来的秒数’值的变量的指针。这里两个函数都返回指向一个结构的指针,该结构的域包含有要求的信息:
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_lsdst;
}
域tm_hour,tm_min,和tm_sec以24小时的时钟格式给出时钟时间,tm_mday是在1到31范围内的该月的日子,tm_mon是范围为0-11月数,一月(January)作为0,tm_year是自1900以来的年数,tm_wday是范围为0到6的一周的日子,星期天(Sunday)为0,tm_yday是范围为0到365该年的日子,一月一日(1 January)作为0,tm_isdst是一个标志规定夏时制是否有效(如果该信息可供使用)。
这两个函数的主要差别是gmtime()给出的它的相对于格林威治时间(GMT)的时间信息,而localtime()给出的它的相对你的本地时区的时间信息(在系统安装和配置期间设置本地时区)。