场景

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

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

说明

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

例子


// test_datetime_format.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <time.h>
#include <sstream>
#include <iostream>
#include <assert.h>

//2014-09-13T10:52:36Z
//2014-09-13 10:52:36
char* ConvertUtcToLocalTime(struct tm* t2,const char* date){

    struct tm t;
    memset(&t,0,sizeof(t));
    t.tm_year = atoi(date)-1900;
    t.tm_mon = atoi(date+5)-1;
    t.tm_mday = atoi(date+8);
    t.tm_hour = atoi(date+11);
    t.tm_min = atoi(date+14);
    t.tm_sec = atoi(date+17);

    time_t tt = _mkgmtime64(&t);
    if(tt != -1){
        if(t2 == NULL){
            t2 = &t;
        }
        *t2 = *localtime(&tt);
        char* ds = (char*) malloc(24);
        memset(ds, 0, 24);
        sprintf(ds, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t2->tm_year + 1900,
                t2->tm_mon + 1, t2->tm_mday, t2->tm_hour, t2->tm_min,
                t2->tm_sec);
        return ds;
    }
    return NULL;
}

//https://www.w3.org/TR/NOTE-datetime
//https://msdn.microsoft.com/en-us/library/2093ets1.aspx
//2014-09-13T10:52:36Z
int _tmain(int argc, _TCHAR* argv[])
{
    const char* kTime = "2014-09-13 18:52:36";
    std::cout << "Source DateTime: " << "2014-09-13T10:52:36Z" << std::endl;
    auto t = ConvertUtcToLocalTime(NULL,"2014-09-13T10:52:36Z");
    std::cout << "Dest DateTime: " << t << std::endl;
    assert(!strcmp(t,kTime));

    t = ConvertUtcToLocalTime(NULL,"2014-09-13 10:52:36");
    std::cout << t << std::endl;
    assert(!strcmp(t,kTime));

    struct tm tt;
    t = ConvertUtcToLocalTime(&tt,"2014-09-13 10:52:36");
    std::cout << t << std::endl;
    assert(!strcmp(t,kTime));
    assert(tt.tm_year == (2014-1900));
    assert(tt.tm_mon == 9-1);
    assert(tt.tm_mday == 13);
    assert(tt.tm_hour == 18);
    assert(tt.tm_min == 52);
    assert(tt.tm_sec == 36);

    return 0;
}

}

输出

Source DateTime: 2014-09-13T10:52:36Z
Dest DateTime: 2014-09-13 18:52:36
2014-09-13 18:52:36
2014-09-13 18:52:36

参考

NOTE-datetime

_mkgmtime

timegm - Linux man page

Converting Between Local Times and GMT/UTC in C/C++

[C/C++标准库]_[初级]_[转换UTC时间到local本地时间]的更多相关文章

  1. STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数

    最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例)我们首 ...

  2. [C/C++11]_[初级]_[std::bind介绍和使用]

    场景 1.C++11 引入了std::function 对象, 这个对象可以通过std::bind封装所有的函数, 并通过代理调用这个std::function的方式调用这个函数. 比如通过统一的方式 ...

  3. [Zlib]_[初级]_[使用zlib库压缩和解压STL string]

    场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说 ...

  4. C语言的本质(26)——C标准库之数值字符串转换

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. #include <stdlib.h> int atoi(const char *nptr); a ...

  5. [ATL/WTL]_[初级]_[选择目录对话框]

    场景 1.起因是创建标准选择目录对话框时使用了 SHCreateItemFromParsingName 函数, 这个函数支持vista以上系统. 之后再winxp上运行就报错: 无法定位程序输入点 S ...

  6. [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]

    场景 1.使用win32绘图时, 最简单的api是使用 graphics.DrawImage(image,x,y)来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关. 说明 1. ...

  7. [数据库]_[初级]_[sqlite3简单使用]

    场景 1.sqlite3在很多小型项目都会用到, 比如用来存储Android的联系人,短信等. 这个小巧的sqlite3是文件型的数据库, 也方便做配置文件和程序打包. 使用sql查询也方面. 所以s ...

  8. Python标准库_ sys,random,time

    一.sys 1.   sys这个模块让你能够访问与Python解释器联系紧密的变量和函数 2.  sys模块中一些重要的函数和变量 argv              命令行参数,包括脚本名称 exi ...

  9. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

随机推荐

  1. 【Java入门提高篇】Day20 Java容器类详解(三)List接口

    今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collection接口的所有操作,它们自然也是有的. Lis ...

  2. 【已解决】mac上appium报错:“Could not find aapt Please set the ANDROID_HOME environment variable with the Android SDK root directory path”

    按照网上教程配置完appium环境后,真机跑自动化过程,遇到如下报错: appium报错如下: [ADB] Checking whether aapt is present [ADB] The AND ...

  3. 目标管理之SMART原则

    SMART原则经常用于KPI制定,也可以用于个人目标管理. SMART原则: S(Specific):目标必须是具体的,需要对标特定的工作目标,不能笼统: M(Measurable):目标必须是可衡量 ...

  4. Gson解析复杂JSON字符串的两种方式

    JSON解析可以使用的库: JSONObject(源自Android官方). Gson(源自Google). Jackson(第三方开源库). FastJSON(第三方开源库). 本文例子使用Goog ...

  5. LeetCode题解之Palindromic Substrings

    1.问题描述 2.问题分析 对于每一个字符,以该字符为中心计算回文个数. 3.代码 int countSubstrings(string s) { ; ) ; ; i < s.size(); i ...

  6. C#多线程的用法10-线程池

    TheadPool:在进行多线程编程时,如果不想频繁的创建线程,那可以考虑使用使用线程池来完成多线程编程的工作.你只需将要处理的任务交付给ThreadPool,如果ThreadPool中有空闲的线程, ...

  7. 【Ansible 文档】【译文】配置文件

    这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...

  8. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-3-Django项目实例

    使用 Django 我们现在将使用 Compose 配置并运行一个 Django/PostgreSQL 应用.在此之前,先确保 Compose 已经安装. 1.通过编辑 Dockerfile文件来指定 ...

  9. MetaMask/provider-engine-1

    https://github.com/MetaMask/provider-engine 在学习这个之前应该先看一下什么是zero-client,MetaMask/zero-client Web3 Pr ...

  10. 2018-2019-2 20165302 《网络对抗技术》Exp3 免杀原理与实践

    一,实验要求 (我是真的不知道为什么截图中都有学号和姓名信息了还要求改主机名......而且实验要求里也没有明确说.做完之后听别人说的,肯定是不能重新截图了,要扣分就扣吧) 通过本部分内容的学习,认识 ...