_get_timezone如何工作?

时间:2013-02-24 16:55:59

标签: c++ c time

我正在尝试更正一个非常奇怪的时间戳类。 它必须做的是获得施工时的当前时间或作为字符串传递的时间。

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

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

我是否必须做任何事情才能初始化此值?我们有一个很大的代码库,我不知道两者之间发生的一切。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

_get_timezone()在调用_tzset()之前返回Redmond默认值28800(太平洋标准时间)。 _tzset()将由许多各种基于时间的函数隐式调用(但是,localtime / 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;

答案 1 :(得分:0)

我会定义自己的函数time_offset,如下所示

#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);
}

这取自here 希望这有帮助