首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ mktime 時區問題:跨時區統一轉換 tm 為 time_t

     編輯:程式設計綜合問答

問題

mktime 依賴本地時區,導致不同機器對同一 tm 結構轉出的 time_t 不一致。需指定時區統一轉換。

解決方案

  1. 獲取當前環境時區偏移:
    time_t now = time(nullptr);
    struct tm *lt = localtime(&now);
    int gmtoff = lt->tm_gmtoff; // GNU 擴展,非標準
  2. 或使用 timezone 全域變數(秒,西為正):
    extern long timezone;
    time_t utc = mktime(&tm) - timezone;
    (注意夏令時)。
  3. **推薦**:使用 Howard Hinnant 的 date.h (C++20 chrono 前身) 或 IANA tz database 庫,明確指定時區轉換:
    auto zt = date::make_zoned("Asia/Shanghai", local_time);
    time_t utc = date::sys_seconds(zt.get_sys_time()).time_since_epoch().count();

簡易修正法

若無法引入第三方庫,可在所有節點統一設定環境變數 TZ=UTC 並呼叫 tzset(),再用 mktime,得到 UTC 時間戳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved