C语言 将GMT转换为本地结果,相差一年



环境:Ubuntu 14.04。

我正在尝试存储格林威治标准时间中指定的struct tm细分时间。这是我的C++函数:

void mygmt(int year, int month, int day, int hour, int minute, int second) {
  struct tm gmtTime;
  memset(&gmtTime, 0, sizeof(struct tm));
  gmtTime.tm_mday = day;
  gmtTime.tm_mon = month - 1; // 0-based
  gmtTime.tm_year = year - 1900;
  gmtTime.tm_hour = hour;
  gmtTime.tm_min = minute;
  gmtTime.tm_sec = second;
  gmtTime.tm_zone = "GMT";
  char buffer [80];
  strftime (buffer,80,"GMT time:  %b %d, %G %I:%M:%S %p %Z.", &gmtTime);
  puts(buffer);  
  time_t rawtime = timegm(&gmtTime);
  struct tm* timeinfo = localtime (&rawtime);
  strftime (buffer,80,"Local time:  %b %d, %G %I:%M:%S %p %Z.",timeinfo);
  puts(buffer);
}

我是这样称呼它的:

// June 11, 2016 23:34:03 (in GMT)
mygmt(2016, 6, 11, 23, 34, 3);

这是输出:

GMT time:  Jun 11, 2015 11:34:03 PM GMT.
Local time:  Jun 11, 2016 04:34:03 PM PDT.

我预计当地时间从格林威治标准时间开始是 -7 小时,这部分输出似乎是正确的。我感到困惑的是格林威治标准时间的输出。它显示与我指定的值相差一年。我该如何解决?

在调用 strftime 之前,调用 timegm 以填充设置为零tm字段:

// ...
time_t rawtime = timegm(&gmtTime);
char buffer [80];
strftime (buffer,80,"GMT time:  %b %d, %G %I:%M:%S %p %Z.", &gmtTime);
puts(buffer);
struct tm* timeinfo = localtime (&rawtime);
strftime (buffer,80,"Local time:  %b %d, %G %I:%M:%S %p %Z.",timeinfo);
// ...

注意:您可以考虑 %Y 而不是 %G(这有点复杂)。

另请参阅:std::mktime 和时区信息和将结构 tm(以 UTC 表示)转换为time_t类型的简单方法。

相关内容

  • 没有找到相关文章

最新更新