学过C语言的都知道有个time函数可以计算时间,
也好像知道time(NULL)返回的是一个距离1970年1月1日0时0分0秒的秒数。
#include <stdio.h> #include <stdlib.h> int main(void) { printf("%d\n", time(NULL)); return 0; }
运行结果:1390351382
乍一看,说法不假,还真是那么一个秒数。
还有不相信的,进一步把秒数、分钟数、小时数分别取出来。
#include <stdio.h> #include <stdlib.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)函数返回的恰恰是世界统一时间。
所以我猜想:只要是在物理上的一个时间点,电脑设置了正确地时区,
电脑的时间也是对应于当地时区的区时,
位于东八区的电脑和位于西五区的电脑运行time(NULL)函数返回的数值是一样的。