将 GMT 转换为相差一年的本地结果

标签 c timezone utc gmt

环境:Ubuntu 14.04。

我正在尝试将 GMT 指定的 segmentation 时间存储到 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 小时,这部分输出似乎是正确的。我感到困惑的是 GMT 时间的输出。它显示与我指定的值相差一年。我如何解决它?

最佳答案

在调用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 and timezone infoEasy way to convert a struct tm (expressed in UTC) to time_t type .

关于将 GMT 转换为相差一年的本地结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779261/

相关文章:

parent 与 child 之间的沟通

javascript - 如何在 Java 或 JS 中检查本地化日期时间是否有效

javascript - day.js 没有将 UTC 转换为本地时间

sql - 在Derby中,是否可以创建一个数据库表,该表的列默认为UTC时间戳?

java - 如何使用 Java 将纪元中的毫秒计数打印为 UTC 中的日期时间?

c - 有什么方法可以使用 #define 指令来定义 printf 函数吗?

c - atof() 返回不明确的值

c - 为什么我们需要动态内存分配,尽管我们可以使用可变长度数组来代替?

cocoa - 比较不同时区的两个 NSDate

Ruby local_to_utc 返回无效年份