时间类型定义:
头文件:time.h
定义为:time_t 某些系统定义为 typedef long time_t
获取时间函数:time_t time(time_t * timer);
time_t time_now;
time(&time_now);
输出时间函数:char *ctime(const time_t *time);
printf(“%s”,ctime(&time_now));
转化时间函数:struct tm *localtime(const time_t *clock);
struct tm *tmp = localtime(&time_now);
tmp->tm_mon 表示月份
tmp->tm_day 表示年
struct tm的里面的元素是秒,分,时,日,月,年,夏令时标志。
反转函数:time_t mktime(strcut tm * timeptr);
改函数使用需要慎重,因为有可能遇到各种各样的日期格式!
计算时间差值:double difftime(time_t time2, time_t time1);
返回time2-time1的值,返回值是double型!
注1:
获取时间之后,使用locatime函数进行转换,输出的日期需要月份加1,年份加1900。因为所求出的秒数是从1970.1.1 00:00:00 至今获取的。
如下面的程序:
注2:
以上的时间都是取的本地时间,而本地时间和UTC是有区别的,也就是格林威治时间。
若想获取格林威治时间,使用函数gmtime();
struct tm *gmtime(const time_t *tp); //将本地时间转换为格林威治时间。
注3:
在一些系统中,time_t被定义为:typedef long time_t,如果这样的话,最大的时间是什么时候?下面程序实现之:
输出结果为:
Tue Jan 19 11:14:07 2038
这说明,到了这个时刻,时间计数将从0开始,系统就是面临着重大的bug。如何解决这个问题,以下是个人猜想:定义时间为 typedef long long time_t;
这样,存储的秒数则为231,除以一年的秒数(365*24*60*60),应该是够用的了!
而像是定义为 long long 型,该怎么存储计算呢?
如果是64位的系统,则计算机一次寻址可以是64位,也就是完全可以胜任;
如果是32位的系统,应该定义成数组,类似的a[2]来实现之。
注4:
在使用夏令时转换的时候,一天并不是24小时,所以使用86400秒/天时需要注意。
注5:
其它的时间函数,这里就不详细讲了。
clock_t clock(void);
char *asctime(const struct tm *tp);
size_t strftime(char *s,size_t smax,const char *fmt,congst struct tm *tp);
儒略日数方案(Jnlian day numbers);