time函数计算时间
学过C语言的都知道有个time函数可以计算时间,
也好像知道time(NULL)返回的是一个距离1970年1月1日0时0分0秒的秒数。
#include <stdio.h> #include <time.h> int main(void) { printf("%d\n", time(NULL)); return 0; }
运行结果:1390351382
乍一看,说法不假,还真是那么一个秒数。
还有不相信的,进一步把秒数、分钟数、小时数分别取出来。
#include <stdio.h> #include <time.h> int main(void) { int t, s, m, h; t = time(NULL); // 秒 s = t % 60; t /= 60; // 分钟 m = t % 60; t /= 60; // 小时 h = t % 24; printf("%d:%d:%d\n", h, m, s); return 0; }
运行结果:0:53:5
奇怪!我的电脑明明是8点53分,为什么上面是0点呢?
哎!还是来个彻底的吧!根据这个秒数把日历时间算出来,
看看到底有什么猫腻。
#include <stdio.h> #include <time.h> char month[2][12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 四年一闰,百年不闰,四百年再闰 int is_leap_year(int year) { // 先找四百年,是闰年 if (year % 400 == 0) return 1; // 再找一百、二百、三百年,是平年 if (year % 100 == 0) return 0; // 最后找四的倍数年,是闰年 if (year % 4 == 0) return 1; // 不是四百的倍数, // 不是一百、二百、三百的倍数, // 不是四的倍数,是平年 return 0; } int main(void) { int t, s, m, h, D, M, Y; int leap, i; t = time(NULL); // 秒 s = t % 60; t /= 60; // 分钟 m = t % 60; t /= 60; // 小时 h = t % 24; t /= 24; // 年 Y = 1970; while (1) { leap = is_leap_year(Y); if (leap && t >= 366) { t -= 366; Y++; } else if (!leap && t >= 365) { t -= 365; Y++; } else break; } // 月 leap = is_leap_year(Y); for (i = 0, M = 1; t >= month[leap][i] ; i++, M++) t -= month[leap][i]; // 日 D = t + 1; printf("%d-%d-%d %d:%d:%d\n", Y, M, D, h, m, s); return 0; }
运行结果:2014-1-22 0:56:3
哦,日期是一样的,分钟也是一样,秒数应该也差不多,只有小时数差了8小时。
这回可以分析了!
我的电脑位于东八区,比世界统一时间(零区时间)快8个小时,
而time(NULL)函数返回的恰恰是世界统一时间。
要想获得本地时间,还要再调用localtime。
#include <stdio.h> #include <time.h> int main(void) { time_t rawtime; struct tm *timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); printf("本地时间:%s", asctime(timeinfo)); return 0; }
运行结果:本地时间:Wed Jan 22 09:28:34 2014
这次返回的结果和我电脑显示的时间是一致的(位于格林威治的世界标准时间到了1点28分)。
C语言作为基础语言实现了这样的时间计算方法,
即世界统一时间和本地时间分离的方法。
好多后来的语言也都有这种机制,
你直接调用某个函数返回的秒数,其实是0时区代表的秒数,
用这个秒数计算出的时间只能是0时区的时间,
而想要东八区的时间,你要再加上8小时。
当然一般也很少有这样一步一步算出来的,
想获得本地时间(对我们来说就是东八区的时间),
直接调用localtime或类似的函数好了(这些函数内部肯定也要考虑时区的)。