概述
最近在分析一些log的时候需要进行时间的处理,log中的时间格式是这样的:"05/Jan/2015:16:12:15"。由于需要计算两个时间的差值,所以将其转换成数字进行处理会比较方便。
于是先解析这个字符串,提取相应的字段,然后用mktime转换成time_t。结果在ubuntu上测试没问题,在android上却出现计算出来的时间比输入的时间少了3600s。
原来是需要把struct tm中的tm_isdst设置成0。这个字段对于北京时间来说应该程序中主动设为0, 否则系统可能把它设成1,造成偏差。
另外,北京时间比UTC/GMT时间早8个小时: http://www.worldtimeserver.com/current_time_in_CN.aspx
time(NULL)得到的是UTC时间,但是如果你把转换成localtime,再转换成UTC时间,就会发现两者差28800s,即8小时。
下面是一些验证性代码以供参考:
#include
#include
#include
#include
#include
struct tm parseTime(const char* ts) { // Format like "05/Jan/2015:16:12:15 +0800" printf("timeFromString:%sn", ts); const char *Monthes[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jly", "Aug", "Sep", "Oct", "Nov", "Dec"}; const int DAY_IDX = 0; const int MON_IDX = 1; const int YEAR_IDX = 2; const int HOUR_IDX = 3; const int MIN_IDX = 4; const int SEC_IDX = 5; const int intervals[6] = {3, 4, 5, 3, 3, 3}; int vals[6]; char buf[5]; for (int i=0; i<6; ++i) { //snprintf(buf, intervals[i], "%s", ts); strncpy(buf, ts, intervals[i]-1); buf[intervals[i]-1] = '