时区
1. 一些基本概念
时区
地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。

为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1-12区,西1-12区。
以本初子午线为界,往西顺次称为西一区直至西十二区,向东为东一区至东12区。中国虽然跨越多个时区,统一使用北京所在的东八区作为中国的标准时间。
见http://www.timedate.cn/time/timezone.htm
GMT (Greenwich Mean Time) 格林威治时间
即本初子午线的时间,一般作为全球时间的基准参考时间。据说是以格林威治天文台命名的。(谁让那时候人家国家牛呢,要是中国制定规则的话没准就以中国时间为准了。)
UTC (Universal Time Coordinated) 世界标准时间或世界协调时间
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。UTC时间和GMT时间其实是同一个时间,只不过UTC时间的单位是秒。定期会进行校准,校准的方式是发布闰秒,即有两个同样的秒。记住,UTC是GMT的以秒为单位的计时。
CST (China Standard Time) 中国标准时间
2. c语言实现
time_t time(time_t *t);
返回当前时刻自1970-01-01 00:00:00 +0000 (UTC)的秒数
将time_t的秒数转化成常规的年月日时分秒周的数据结构
struct tm *gmtime(const time_t *timep);
struct tm {
int tm_sec; /* seconds 0 - 59*/
int tm_min; /* minutes 0 - 59*/
int tm_hour; /* hours 0 - 23*/
int tm_mday; /* day of the month 1 - 31*/
int tm_mon; /* month 0 - 11*/
int tm_year; /* year ,since 1900*/
int tm_wday; /* day of the week 0 - 6*/
int tm_yday; /* day in the year 0 - 365*/
int tm_isdst; /* daylight saving time */
};
将常规的年月日时分秒周的数据结构转换成time_t的秒数
time_t mktime(struct tm *tm);
比较时间
double difftime(time_t time1, time_t time0);
获取本地时间,由于time()获取的是UTC时间,但UTC时间并不是本地时间,本地时间需在utc时间基础上通过时区计算才能得到
struct tm *localtime(const time_t *timep);
打印出时间
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);
参考:
1. https://wenku.baidu.com/view/87c8f6145f0e7cd1842536d9.html
2. http://blog.****.net/irwin_chen/article/details/8814676