C/C++标准库之转换UTC时间到local本地时间详解

前言

UTC 时间DateTime.UtcNow 和 系统本地时间 DateTime.Now 相差8个时区 ,美国本地时间和北京时间相差15个时区: 美国,而一般使用UTC时间方便统一各地区时间差异。

场景

1.如果有面向全球用户的网站, 一般在存储时间数据时存储的是UTC格式的时间, 这样时间是统一的, 并可以根据当地时区来进行准确的转换.

2.存储本地时间的问题就在于如果换了时区, 那么显示的时间并不正确. 所以我们存储时间时最好还是存储UTC时间,便于正确的转换.

说明

1.C/C++标准库提供了标准函数可以转换, 不需要借助Win32 API.

例子

  1. // test_datetime_format.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <time.h>
  5. #include <sstream>
  6. #include <iostream>
  7. #include <assert.h>
  8. //2014-09-13T10:52:36Z
  9. //2014-09-13 10:52:36
  10. char* ConvertUtcToLocalTime(struct tm* t2,const char* date){
  11. struct tm t;
  12. memset(&t,0,sizeof(t));
  13. t.tm_year = atoi(date)-1900;
  14. t.tm_mon = atoi(date+5)-1;
  15. t.tm_mday = atoi(date+8);
  16. t.tm_hour = atoi(date+11);
  17. t.tm_min = atoi(date+14);
  18. t.tm_sec = atoi(date+17);
  19. time_t tt = _mkgmtime64(&t);
  20. if(tt != -1){
  21. if(t2 == NULL){
  22. t2 = &t;
  23. }
  24. *t2 = *localtime(&tt);
  25. char* ds = (char*) malloc(24);
  26. memset(ds, 0, 24);
  27. sprintf(ds, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t2->tm_year + 1900,
  28. t2->tm_mon + 1, t2->tm_mday, t2->tm_hour, t2->tm_min,
  29. t2->tm_sec);
  30. return ds;
  31. }
  32. return NULL;
  33. }
  34. //https://www.w3.org/TR/NOTE-datetime
  35. //https://msdn.microsoft.com/en-us/library/2093ets1.aspx
  36. //2014-09-13T10:52:36Z
  37. int _tmain(int argc, _TCHAR* argv[])
  38. {
  39. const char* kTime = "2014-09-13 18:52:36";
  40. std::cout << "Source DateTime: " << "2014-09-13T10:52:36Z" << std::endl;
  41. auto t = ConvertUtcToLocalTime(NULL,"2014-09-13T10:52:36Z");
  42. std::cout << "Dest DateTime: " << t << std::endl;
  43. assert(!strcmp(t,kTime));
  44. t = ConvertUtcToLocalTime(NULL,"2014-09-13 10:52:36");
  45. std::cout << t << std::endl;
  46. assert(!strcmp(t,kTime));
  47. struct tm tt;
  48. t = ConvertUtcToLocalTime(&tt,"2014-09-13 10:52:36");
  49. std::cout << t << std::endl;
  50. assert(!strcmp(t,kTime));
  51. assert(tt.tm_year == (2014-1900));
  52. assert(tt.tm_mon == 9-1);
  53. assert(tt.tm_mday == 13);
  54. assert(tt.tm_hour == 18);
  55. assert(tt.tm_min == 52);
  56. assert(tt.tm_sec == 36);
  57. return 0;
  58. }
  59. }

输出

  1. Source DateTime: 2014-09-13T10:52:36Z
  2. Dest DateTime: 2014-09-13 18:52:36
  3. 2014-09-13 18:52:36
  4. 2014-09-13 18:52:36

C++中获取UTC时间精确到微秒的实现代码

在日常开发过程中经常会使用到时间类函数的统计,其中获取1970年至今的UTC时间是比较常使用的,但是在windows下没有直接能够精确到微妙级的函数可用。本文提供方法正好可以解决这类需求问题。

下面先给出C++实现代码:

代码如下:

  1. #ifndef UTC_TIME_STAMP_H_
  2. #define UTC_TIME_STAMP_H_
  3. #include <windows.h>
  4. #include <sys/timeb.h>
  5. #include <time.h>
  6. #if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
  7. struct timeval
  8. {
  9. long tv_sec;
  10. long tv_usec;
  11. };
  12. #endif
  13. static int gettimeofday(struct timeval* tv)
  14. {
  15. union {
  16. long long ns100;
  17. FILETIME ft;
  18. } now;
  19. GetSystemTimeAsFileTime (&now.ft);
  20. tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
  21. tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
  22. return (0);
  23. }
  24. //获取1970年至今UTC的微妙数
  25. static time_t TimeConversion::GetUtcCaressing()
  26. {
  27. timeval tv;
  28. gettimeofday(&tv);
  29. return ((time_t)tv.tv_sec*(time_t)1000000+tv.tv_usec);
  30. }
  31. #endif

接下来给出使用方法:

  1. timeval tv;
  2. gettimeofday(&tv);

或者直接调用:GetUtcCaressing();

UTC时间秒级UTC获取方法代码:

  1. time_t timep;
  2. struct tm *p;
  3. time(&timep);
  4. p=localtime(&timep);
  5. timep = mktime(p);
  6. printf("%d\n",timep);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

参考

  • NOTE-datetime
  • _mkgmtime
  • timegm - linux man page
  • Converting Between Local Times and GMT/UTC in C/C++
本文标题: C/C++标准库之转换UTC时间到local本地时间详解
本文地址: http://www.cppcns.com/ruanjian/c/211882.html
(0)

相关推荐

  • 一学就会的 Python 时间转化总结(超全)

    作者:Peter 来源:Python编程时光 在生活和工作中,我们每个人每天都在和时间打交道: 早上什么时候起床? 地铁几分钟来一趟? 中午什么时候开始午休? 明天是星期几? 距离上次买衣服已经2个月 ...

  • 君子兰什么时间分苗最合适,详解君子兰分苗时间和步骤

    2020/5/5 21:17:08 君子兰繁殖后,长出幼苗后需要分苗.有花友觉得小的幼苗分苗好,有的觉得长大点分苗好成活,君子兰什么时间分苗最合适,对播种繁殖和分株繁殖的幼苗分苗时间有不同吗?播种繁殖 ...

  • 颈椎病很难受?标准的颈椎按摩动作来了,动图详解

    大多数人每天都在长时间地伏案工作.玩手机.操作电脑.看书等,一直低着头,颈椎承受的压力非常大. 颈椎疼痛本身就很可怕,但更可怕的是潜伏在暗处的颈椎病连锁反应,它可能造成身体各个部位的病变. 有70%的 ...

  • python3常用标准库

    python3常用标准库 趁着有时间,把一些我用过的常用标准库进行整理和复习. time 用法 说明 time.time() 返回时间戳(从1970年1月1日00:00:00开始计算) time.lo ...

  • 用Python标准库turtle画一头金牛,祝您新年牛气冲天!(附源码)

    今年是牛年,祝大家新年牛气冲天!嗨皮牛Year! 前几天在百度图片里下载了一张金牛的图片,就是封面的这张.想着用Python标准库turtle肯定可以画出这张图,所以说干就干,花两天时间实现了. 画图 ...

  • Python标准库模块之heapq

    该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...

  • 使paramiko库执行命令时,在给定的时间强制退出

    原因: 使用paramiko库ssh连接到远端云主机上时,非常偶现卡死现象,连接无法退出(可以是执行命令时云主机重启等造成).需要给定一段时间,不管命令执行是否卡住,都退出连接,显示命令执行超时错误. ...

  • 如何避免C标准库缓冲区溢出

    C中大多数缓冲区溢出问题可以直接追溯到标准 C 库.最有害的罪魁祸首是不进行自变量检查的.有问题的字符串操作strcpy.strcat.sprintf 和 gets. 大部分程序员仍然会使用这些函数, ...

  • C语言这些常用的标准库(头文件),你不得不知道...

    有很多工程师喜欢自己封装一些标准库已有的函数,其实自己封装的函数,并不一定比标准库好,有时候反而代码更冗余,且有bug. 下面小编就来分享一下C语言常见的一些标准库. 标准头文件包括: <ass ...

  • Go标准库之html/template

    html/template包实现了数据驱动的模板,用于生成可防止代码注入的安全的HTML内容.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用html/templ ...