代码之家  ›  专栏  ›  技术社区  ›  Peter Coulton

以C/C格式在本地时间和GMT/UTC之间转换++

  •  29
  • Peter Coulton  · 技术社区  · 7 年前

    所谓“datetime”,我指的是一些包含日期和时间的时间表示。我会很高兴的 time_t , struct tm ,或使其成为可能的任何其他表示。

    我的平台是Linux。

    这里是我试图解决的具体问题:我得到一对值,其中包含一个朱利安日期和一天中的秒数。这些值以GMT为单位。我需要将其转换为本地时区“YYYYMMDDHHMMSS”值。我知道如何将朱利安日期转换为Y-M-D,显然将秒转换为HHMMS很容易。然而,棘手的部分是时区转换。我相信我能找到一个解决方案,但我更愿意找到一个“标准”或“知名”的方式,而不是跌跌撞撞地四处走动。


    一个可能相关的问题是 Get Daylight Saving Transition Dates For Time Zones in C

    3 回复  |  直到 9 年前
        1
  •  23
  •   Rick C. Petty    17 年前

    你应该使用 gmtime / localtime timegm / mktime . 这将为您提供正交工具,以便在 struct tm time_t

    time_t t;
    struct tm tm;
    struct tm * tmp;
    ...
    t = timegm(&tm);
    ...
    tmp = gmtime(t);
    

    t = mktime(&tm);
    ...
    tmp = localtime(t);
    

    全部的 tzset() does是从中设置的内部时区变量 TZ

    如果您试图在时区之间转换,则应修改 将时间 tm_gmtoff .

        2
  •  19
  •   Robert Cowham    16 年前

    struct tm *tptr;
    time_t secs, local_secs, gmt_secs;
    time( &secs );  // Current time in GMT
    // Remember that localtime/gmtime overwrite same location
    tptr = localtime( &secs );
    local_secs = mktime( tptr );
    tptr = gmtime( &secs );
    gmt_secs = mktime( tptr );
    long diff_secs = long(local_secs - gmt_secs);
    

    或者类似的东西。。。

        3
  •  3
  •   chrish    17 年前

    如果您需要担心使用时区规则转换日期/时间,您可能需要研究 ICU .