C++ 时区是如何工作的?

C++ 时区是如何工作的?,c++,c,time,C++,C,Time,我正试图纠正一个表现得很奇怪的timestamp类。 它必须做的是在构造时获取当前时间,或者获取作为字符串传递的时间 我只想使用UTC,因为这些日期实际上并不显示在任何地方,但时间戳之间的差异是有限的 在任何情况下,我都调用strtime(timestamp,m_format.c_str(),&time)从字符串中获取tm时间。这个字符串是UTC时间,所以如果我想调用mktime以获取时间,我必须用当前时区修改它,所以我这样做time.tm\u hour-=tz/3600其中tz通过调用\u g

我正试图纠正一个表现得很奇怪的timestamp类。 它必须做的是在构造时获取当前时间,或者获取作为字符串传递的时间

我只想使用UTC,因为这些日期实际上并不显示在任何地方,但时间戳之间的差异是有限的

在任何情况下,我都调用
strtime(timestamp,m_format.c_str(),&time)
从字符串中获取tm时间。这个字符串是UTC时间,所以如果我想调用
mktime
以获取时间,我必须用当前时区修改它,所以我这样做
time.tm\u hour-=tz/3600
其中
tz
通过调用
\u get\u timezone
来检索。问题是这个函数似乎返回28800,这是默认值,但是如果我稍后在代码中调用它,它会给我-7200,这是正确的值

我需要做些什么来初始化这个值吗?我们有一个很大的代码库,我不知道其间发生的一切

此外,如果有人有一个类似类的链接,我会非常感激,因为我可能会注意到我的错误


谢谢。

我将自己的函数时间偏移定义如下

#include <time.h>
double time_offset()
{
    time_t now = time(NULL);

    struct tm *gm = gmtime(&now);
    time_t gmt = mktime(gm);

    struct tm *loc = localtime(&now);
    time_t local = mktime(loc);

    return difftime(local, gmt);
}
#包括
双时间偏移量()
{
time\u t now=时间(空);
struct tm*gm=gmtime(&now);
时间\u t gmt=mktime(gm);
struct tm*loc=localtime(&now);
本地时间=mktime(loc);
返回时间(本地,格林尼治标准时间);
}
这是从 希望这有助于

\u get_timezone()在调用_tzset()之前返回Redmond默认值28800(太平洋标准时间)_tzset()将由许多不同的基于时间的函数隐式调用(但是localtime/mkttime似乎不调用此函数)

我也遇到了一个问题,它没有被初始化,或者被初始化,然后返回到28800,然后再次初始化。我决定完全避免

下面是我用来获取Windows信息的机制。这不会在_get_时区出现明显的初始化竞争:

TIME_ZONE_INFORMATION tz;
DWORD rc = ::GetTimeZoneInformation(&tz);
offset_minutes = tz.Bias + (TIME_ZONE_ID_DAYLIGHT != rc ?  tz.StandardBias : tz.DaylightBias);
offset_seconds = offset_minutes * 60;

您是否在两次不同的通话中更改了系统的时区?旁注:您的“time.tm_hour-=tz/3600”可能是次要问题,因为世界各地的时区差是半小时的倍数。建议时间tm_秒-=tz;“表现得很奇怪”