[C/C++]_[初級]_[關於使用C標準時間庫對UTC和本地時間的轉換]
阿新 • • 發佈:2018-12-01
場景
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