将 GMT 转换为本地结果,相差一年
Converting GMT to local results in one year difference
环境:Ubuntu 14.04。
我正在尝试将 GMT 指定的故障时间存储到 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 info and Easy way to convert a struct tm (expressed in UTC) to time_t type。
环境:Ubuntu 14.04。
我正在尝试将 GMT 指定的故障时间存储到 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 info and Easy way to convert a struct tm (expressed in UTC) to time_t type。