我正在尝试纠正一个非常奇怪的时间戳记类。
它要做的是获取构造时的当前时间或以字符串形式传递的时间。

我只想使用UTC,因为这些日期并未真正显示在任何地方,而是一个时间戳与另一个时间戳之间的差异。

无论如何,我都调用strptime(timestamp, m_format.c_str(), &time);从字符串中获取tm时间。此字符串是UTC时间,因此如果我想调用mktime来获取时间为time_t,则必须使用当前时区对其进行修改,因此我要执行此time.tm_hour-=tz/3600,通过调用tz检索_get_timezone。问题是此函数似乎返回28800,这是默认值,但是如果我稍后在代码中调用它,它将给我-7200,这是正确的值。

我是否需要做任何事情来初始化该值?我们的代码库很大,我不知道这之间发生的一切。

此外,如果有人链接到类似的类(class),我会非常感激,因为我可能会在那儿注意到我的错误。

谢谢。

最佳答案

_get_timezone()返回Redmond的默认值28800(太平洋标准时间),然后再调用_tzset()。 _tzset()将被许多基于时间的各种函数隐式调用(但是,本地时间/ mkttime似乎并未调用此函数)。

我也遇到了未初始化或初始化的问题,然后又回到28800,然后再次初始化。我决定完全避免它。

这是我用来在Windows上获取信息的机制。这不会在_get_timezone中遭受明显的初始化争用:

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;

09-06 17:46