时区

来源:互联网 发布:mac拷不进移动硬盘 编辑:程序博客网 时间:2024/04/30 02:44

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.csdn.net/irwin_chen/article/details/8814676