- 首先,先介绍简单介绍一下世界时区:全世界有24个时区,其中以格林威治时间为世界标准的时区(GMT+0),其它时区的时间都是在这个标准时间的基础上加减从而得到本时区的标准时间。例如我们中国的时间就是在GMT时间加上8个小时。
- Linux中与时区有关的变量
TZ这个变量指定了当前的系统时区。这个时区值勤会影响下面的一引起时间转换。例如假设当前的系统时间是10:00AM,如果我们把当前的时区设置成东八区,则标准时间就是(即GMT+0)的时间就是10-8=2:00AM,如果是看成是东6区的话,则标准时间就变成了10-6=4:00AM了。
时区设置的函数是:setenv("TZ", "GMT-8", 1);
表示的意思就是:将当前时区设置成东八区。需要注意的是,这里要写成GMT-8才是东八区,不是GMT+8,原因GMT表示时间的方式有点不同,它的格式是(GMT[+/-]offset),如果目标时区是在东区,则是负的,否则是正的。意思就是本地时区加减多少(offset)才能得到标准时间。
3. C/C++时间转换的相关函数
time_t mktime(struct tm *timeptr
);
struct tm *localtime(const time_t *timer
);
struct tm *gmtime(const time_t *timer
);
mktime 是将一个tm*结构转换成自1970/1/1 00:00:00(GMT+0)到当前与tm相对应的GMT当前时间的秒数。此函数受到环境变量TZ的影响。
例如:当前的tm是:1970/1/1-16:00:00,TZ是东八区(由此可知GMT+0的时间是8:00AM)
struct tm local;
area = &local;
area->tm_year = 70;
area->tm_mon = 0;
area->tm_mday = 1;
area->tm_hour = 16;
area->tm_min = 0;
area->tm_sec = 0;
area->tm_isdst = 0;
那么我们最后调用mktime的结果是:(16-8)*3600 = 28800;
localtime这个函数由它的名字可知它是将一个表示GMT+0的标准时间转换成本地时区的时间。
例如timer 的值是上面的28800, 并且当前的TZ设置成东六区,那么我们的本地时间就是(28800/3600+6)=14点。意思:28800表示当前GMT+0是8:00AM, 那么GMT+6(东六)本地所在的时间就是下午2点。
最后是gmttime,它不受到TZ变量的影响,参数timer表示自1970/1/1-0:0:0(GMT+0)到某一个GMT+0时间点的秒数。gmtime的运算结果就是这个GMT+0时区的这个时间点。
例如timer = 28800,那么当地的时间就是1970/1/1-08:00:00 AM.