最近在分析一些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:%s\n", 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] = '\0'; ts += intervals[i]; if (i == 1) { for (int j=1; j<=12; ++j) { if (!strncmp(buf, Monthes[j-1], 3)) { vals[i] = j; break; } } } else { vals[i] = atoi(buf); } //printf("buf:%s, %d\n", buf, vals[i]); } struct tm y2k; y2k.tm_year = vals[YEAR_IDX] - 1900; y2k.tm_mon = vals[MON_IDX] - 1 ; y2k.tm_mday = vals[DAY_IDX]; y2k.tm_hour = vals[HOUR_IDX]; y2k.tm_min = vals[MIN_IDX]; y2k.tm_sec = vals[SEC_IDX];; y2k.tm_isdst = 0; // important for Chinese time! no dst! return y2k; } time_t localTimeFromString(const char* ts) { struct tm y2k = parseTime(ts); return mktime(&y2k); } time_t localTimeToUTC(const char* ts) { time_t result; struct tm y2k = parseTime(ts); #if 0 result = mktime(&y2k) - timezone; printf("timezone:%ld\n", timezone); //printf("mktime:%ld\n", result); #else char *oldTZ = getenv("TZ"); putenv("TZ=UTC"); tzset(); result = mktime(&y2k); //printf("mktime:%ld\n", result); printf("timezone:%ld\n", timezone); if(oldTZ == NULL) { putenv("TZ="); } else { char buf[256]; sprintf(buf, "TZ=%s", oldTZ); putenv(buf); } tzset(); #endif return result; } int formatTime(time_t t, char *buf, int maxsize) { const char* format = "%d/%b/%Y:%H:%M:%S\n"; struct tm *tmp; tmp = localtime(&t); if (tmp == NULL) { perror("localtime"); return -1; } if (strftime(buf, maxsize, format, tmp) == 0) { fprintf(stderr, "strftime returned 0"); return -1; } return 0; } int main () { time_t now = time(NULL); char buf[256] = {0}; formatTime(now, buf, 256); printf("formatedString:%s\n", buf); time_t nt = localTimeFromString(buf); printf("oldtime:%ld\nnewtime:%ld\n", now, nt); const char *s = "01/Jan/1970:00:00:00"; time_t utcT = localTimeToUTC(s); printf("timer: %ld, utcT:%ld\n", time(NULL), utcT); utcT = localTimeToUTC(buf); printf("now: %ld\nutcT:%ld\ndiff:%f\n", now, utcT, difftime(utcT, now)); return 0; } 

mktime时间的转换相关推荐

  1. php时间转成毫秒数,PHP中mktime时间转换成毫秒的方法

    在php中要把时间日期转换成时间戳(转换成毫秒)我们有很多方法,最简单的就是利用time()直接获取的是毫秒如果是如2012-05-31这样的话,有要用其它方法了. mktime()函数对计算日期和确 ...

  2. php把时间格式转换为时间戳,php如何将时间格式转换成时间戳?

    php时间格式转换为时间戳的方法:1.使用mktime()将时间转换为时间戳,语法为"mktime(小时.分钟.秒.月.日.年)":2.使用strtime()将字符串表示的日期转换 ...

  3. linux下unix timestamp 与 可视化时间/常规时间进行转换

    unix timestamp 与 可视化时间/常规时间进行转换. 最近工作中需要根据可视化时间得到unix timestamp,完成工作之后记录下来了,防止下次遇到此问题时,又需要重新梳理,直接上代码 ...

  4. pandas 如何把时间转成index_pandas 时间格式转换的实现

    pandas 时间格式转换的实现 OUTLINE 常见的时间字符串与timestamp之间的转换 日期与timestamp之间的转换 常见的时间字符串与timestamp之间的转换 这里说的字符串不是 ...

  5. 将时间格式转换成秒数

    将时间格式转换成秒数 <span style="font-size:18px;"><span style="font-size:24px;"& ...

  6. python模块--datetime时间加减、时间转时间戳、GMT时间格式转换

    1.时间模块加减乘除 import datetime # 获取datetime时间格式并将其转换成字符串 a = datetime.datetime.now().strftime("%Y-% ...

  7. python 时间格式转换,秒级和毫秒级时间戳转换

    1. 时间格式转换 # -*- coding=utf8 -*- import datetime import time import pytzutc = "2017-07-28T08:28: ...

  8. 语言 全排列 函数_Power Query 中日期时间格式转换需要了解的区域语言对照表

    不同的国家有不同的日期时间书写格式,比如: 多数亚洲国家:yyyy-MM-dd hh:mm 有些欧洲国家:dd.MM.yyyy HH:mm 极少数的国家:MM/dd/yyyy h:mm tt 还有各种 ...

  9. 彻底解决Spring mvc中时间的转换和序列化等问题

    彻底解决Spring mvc中时间的转换和序列化等问题 参考文章: (1)彻底解决Spring mvc中时间的转换和序列化等问题 (2)https://www.cnblogs.com/childkin ...

最新文章

  1. 进入公司第五届、六个月
  2. 绝命沙虫 精度,double,模拟 牛客白月赛44
  3. android espresso跨程序,Android Espresso:依次运行多个测试
  4. YY的GCD(洛谷-P2257)
  5. python简单代码需要写多久_python基本语法?初学Python要多久才能入门?
  6. FCKeditor上传漏洞总结
  7. 新地址 贴吧_建议收藏 | 新媒体人必备5大工具
  8. Windows服务器时间同步设置大比拼
  9. SPI协议的通信原理
  10. 【Ubuntu】升到14,攻克了进入用户后没有菜单条导航栏的问题
  11. 黑马程序员:Java学习路线图上线了
  12. 企业公关“示弱”思维下的“变脸”戏法
  13. 【Datawhale组队学习】机器学习数学基础 - 一元函数微分学的几何应用【Task 04】
  14. shader拖尾_拖尾效果 - LouisSong - 博客园
  15. 盈一份恬淡,安然一世春秋!
  16. 寻根究底,探讨 chi -square特征词选择方法后面的数学支持
  17. 机器学习:k-means聚类算法+算法优化
  18. APP - APP监控软件,美团 24 小时不间断定位上热搜
  19. 关于DataPump工具引发OGG中断原因
  20. 参加51CTo培训,红帽RHCE认证考试通过啦

热门文章

  1. 你必须知道的最好的开源WEB 资源
  2. Opera全球CEO:计划近期推出中国版浏览器
  3. Stata 画图配色
  4. ECMAScript视频-张晓飞-专题视频课程
  5. pythonweb数据可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)
  6. 【NLP】from glove import Glove的使用、模型保存和加载
  7. 气象接口返回图标_天气预报查询接口
  8. [转载]2012 年 4 月,rating排行榜
  9. windows应用小技巧
  10. 软件工程 选课系统的uml类图_UML建模学生选课系统(类图+对象图+用例图+部署图)...