版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/infoworld/article/details/80961555
场景
Android,Java的Date是UTC时间, 我们在读取某些表的数值时往往得到的就是UTC秒数, 如何用C++转换为本地时间是一个常见的功能需求.
还有就是UTC到本地时间的转换, 已知道一个字符串的UTC时间,如何转换为对应的本地时间. C标准时间库+扩展库具备这些关键转换.
说明
- Coordinated Universal Time 世界统一时间, 世界标准时间. 或者叫做 epoch time,Unix time.
- Greenwich Mean Time(GMT) 也就是 UTC. 格林威治时间和UTC时间均用秒数来计算的
- 当前的UTC时间 是从 1970年01月01日 0:00:00 开始到现在所相差的秒数. 如果需要转换为日期, 那么需要通过函数进行转换.
- C标准库里的time_t类型, 它代表一个秒数, 从 1970.1.1 00:00 开始到 time_t所代表的时间的间隔的秒数.
- 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