1. 程式人生 > >[C/C++]_[初級]_[關於使用C標準時間庫對UTC和本地時間的轉換]

[C/C++]_[初級]_[關於使用C標準時間庫對UTC和本地時間的轉換]

場景

  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