我正在编写一些可以在多个互通系统上运行的代码。我正在使用time()获取time_t,但是这导致了系统之间的时区差异问题,因此我想在GMT中获取time_t。我一直在浏览time.h函数,但是我不清楚如何确定我将正确获得时间。到目前为止,这是我想出的:

time_t t = time();
struct tm *gtm = gmtime(&t);
time_t gt = mktime(gtm);

现在,这似乎可以在我的机器上找到正确的答案,但是我想知道在将其推出之前,它是否可以通用,即使其他机器的时钟设置为本地时间或格林尼治标准时间或其他时区或任何其他时间。我担心的原因是因为mktime。在描述中,它表示将tm结构解释为“以本地时间表示的日历时间”。在我看来,这似乎不会返回GMT时间,尽管它似乎在我的计算机上。另外,当我打印出gt时,它比t提前4小时,这似乎是正确的。但是,如果我运行以下命令:
time_t t = time();
struct tm *gtm = gmtime(&t);
struct tm *ltm = localtime(&t);
printf("%d, %d\n", gtm->tm_hour, ltm->tm_hour);

时间是相同的,并且是本地时间,这不是我期望的。

作为记录,在另一个答案中,我看到了对timegm()的引用,这听起来很完美,但是在我的系统上不存在。

简而言之,如何在C中任何Windows机器上的GMT中获取time_t?

编辑:删除了添加的msvcrt标记,因为我没有使用msvcrt。

最佳答案

根据定义,time_t始终为UTC。所以time()可以满足您的需求。时区仅在您在time_t和 segmentation 时间表示之间进行转换时才起作用。

如果您使用 segmentation 时间表示形式的UTC中的时间,则需要临时将时区切换为UTC,使用mktime()转换为time_t,然后将时区切换回,如下所示:

time_t convert_utc_tm_to_time_t (struct tm *tm)
{
    char *tz;
    time_t result;

    /* temporarily set timezone to UTC for conversion */
    tz = getenv("TZ");
    if (tz) {
      tz = strdup (tz);
      if (!tz) {
        // out of memory
        return -1;
      }
    }
    setenv("TZ", "", 1);
    tzset();

    tm->tm_isidst = 0;
    result = mktime (tm);

    /* restore timezone */
    if (tz) {
      setenv("TZ", tz, 1);
      free (tz);
    }
    else {
      unsetenv("TZ");
    }
    tzset();

    return result;
}

10-06 05:45