作者 mail: [email protected]
c++中时间主要分为GMT时间和本地时间。GMT时间叫做格林威治时间,也就是UTC时间,这个时间有点特殊,它所在时区为0,在这个时区内,本地时间和GMT时间完全一致,地球上其他地方的时间都得在这个时间基础上加一个时区,这才是其他地方的本地时间。地球被分为24个时区,相邻时区相差一个小时。比如中国上海是+8区,意思就是,假如格林威治现在是27日1点0分0秒,而中国上海就是27日早上9点0分0秒。我们比格林威治早8个小时进入27号。具体的时区信息请看《 http://zh.wikipedia.org/wiki/时区列表 》,(时区从UTC-12到UTC+14)
时区信息存放在/usr/share/zoneinfo/中,如上海时区文件就是/usr/share/zoneinfo/Asia/Shanghai中。时区可以由环境变量TZ设置,上海的就可以export TZ="Asia/Shanghai"。在c++程序中调用tzset()函数可以由环境变量TZ初始化时区信息。如果没有环境变量TZ,tzset()还会使用/etc/localtime来初始化时区信息。TZ环境变量可以指向绝对路径,也可以是相对路径。如果是相对路径则以/usr/share/zoneinfo/为基准路径。struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ }; struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of DST correction */ };
time_t time(time_t *t);
int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz);
struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result);
struct tm *localtime(const time_t *timep); struct tm *localtime_r(const time_t *timep, struct tm *result);
time_t mktime(struct tm *tm);
void tzset (void); extern char *tzname[2]; extern long timezone; extern int daylight;
#include <time.h> tzset (); time_t current_timet; time(¤t_timet);//得到当前时间秒数 struct tm utc_tm; gmtime_r (¤t_timet, &utc_tm);//得到GMT,即UTC时间 struct tm local_tm; localtime_r(¤t_timet, &local_tm);//得到本地时间,根据如下打印看出两者相差8小时。 printf ("current_timet: %d, timezone info:[%d / %d]\n", current_timet, timezone, daylight); printf ("utc_tm: %d-%d-%d %d:%d:%dZ\n", utc_tm.tm_year, utc_tm.tm_mon, utc_tm.tm_mday, utc_tm.tm_hour, utc_tm.tm_min, utc_tm.tm_sec); printf ("local_tm: %d-%d-%d %d:%d:%d\n", local_tm.tm_year, local_tm.tm_mon, local_tm.tm_mday, local_tm.tm_hour, local_tm.tm_min, local_tm.tm_sec); struct tm local_tm2 = utc_tm; local_tm2.tm_sec -= timezone; local_tm2.tm_isdst = daylight; //将utc时间转换成本地时间 time_t local_timet2 = mktime(&local_tm2);//得到秒数 printf ("\nlocal_timet2=%d\n", local_timet2);//可以看出,和一开始得到的当前时间秒数相同。daylight部分没有仔细测。
time_t now; time(&now); DEBUG ("now:%d",now) struct tm* timeNow = gmtime (&now); DEBUG ("timeNOw:sec=%d, min=%d, hour=%d, mday=%d, mon=%d, year=%d, wday=%d, yday=%d, isdst=%d", timeNow->tm_sec, timeNow->tm_min, timeNow->tm_hour, timeNow->tm_mday, timeNow->tm_mon, timeNow->tm_year, timeNow->tm_wday, timeNow->tm_yday, timeNow->tm_isdst); struct tm tm1 = *timeNow; DEBUG ("tm1 :sec=%d, min=%d, hour=%d, mday=%d, mon=%d, year=%d, wday=%d, yday=%d, isdst=%d", tm1.tm_sec, tm1.tm_min, tm1.tm_hour, tm1.tm_mday, tm1.tm_mon, tm1.tm_year, tm1.tm_wday, tm1.tm_yday, tm1.tm_isdst);
/******************************************************************* • 此文章解释权归windsome所有,如要转载无须联系本人。 • QQ: 35327864 • msn: [email protected] • mail: [email protected] ********************************************************************/