[C/C++]_[初级]_[关于使用C标准时间库对UTC和本地时间的转换]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/infoworld/article/details/80961555

场景

  1. Android,Java的Date是UTC时间, 我们在读取某些表的数值时往往得到的就是UTC秒数, 如何用C++转换为本地时间是一个常见的功能需求.

  2. 还有就是UTC到本地时间的转换, 已知道一个字符串的UTC时间,如何转换为对应的本地时间. C标准时间库+扩展库具备这些关键转换.

说明

  1. Coordinated Universal Time 世界统一时间, 世界标准时间. 或者叫做 epoch time,Unix time.
  2. Greenwich Mean Time(GMT) 也就是 UTC. 格林威治时间和UTC时间均用秒数来计算的
  3. 当前的UTC时间 是从 1970年01月01日 0:00:00 开始到现在所相差的秒数. 如果需要转换为日期, 那么需要通过函数进行转换.
  4. C标准库里的time_t类型, 它代表一个秒数, 从 1970.1.1 00:00 开始到 time_t所代表的时间的间隔的秒数.
  5. C标准库里的日期时间结构体,需要注意的 tm_year 是从1900开始的年份差, 如果需要得到实际的年份,需要+1900.

例子

int TestTime()
{
    // 获取当前时间的 UTC 秒数.
    time_t now;
    time(&now);

    std::cout << "now: " << now << std::endl;

    auto PrintDate = [](struct tm* ttm,const char* key)->char*{
        char buf[32] = {0};
        sprintf(buf, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", ttm->tm_year+1900,
                ttm->tm_mon + 1, ttm->tm_mday, ttm->tm_hour, ttm->tm_min,
                ttm->tm_sec);
        std::cout <<  key  <<" date: " << buf << std::endl;
        return strdup(buf);
    };

    // 把UTC时间转换为 tm 结构体, 注意不是本地时间,是世界统一时间,全时间的时间都一样.
    struct tm utc_tm1 = *gmtime(&now);
    auto utc_str = PrintDate(&utc_tm1,"utc");

    // 本地日期, 也就是当前时区的日期.
    auto local_t1 = localtime(&now);
    PrintDate(local_t1,"local");

    // 知道UTC的日期转换为本地日期
    time_t tt = _mkgmtime64(&utc_tm1);
    auto local_t2 = localtime(&tt);
    PrintDate(local_t2,"utc->local");

    // 知道本地日期转换为UTC日期
    auto utc_time = mktime(local_t1);
    auto ttm1 = gmtime(&utc_time);
    PrintDate(ttm1,"local->utc");

    return 0;
}

输出

now: 1531046852
utc date: 2018-07-08 10:47:32
local date: 2018-07-08 18:47:32
utc->local date: 2018-07-08 18:47:32
local->utc date: 2018-07-08 10:47:32

参考

Java Date
UTC时间-GMT时间-本地时间-Unix时间戳
Seconds Since the Epoch

猜你喜欢

转载自blog.csdn.net/infoworld/article/details/80961555