_get_timezone是如何工作的

How does _get_timezone work?

本文关键字:工作 何工作 get timezone      更新时间:2023-10-16

我正在尝试更正一个时间戳类,它的行为非常奇怪。它所要做的是在构造时获取当前时间或作为字符串传递的时间。

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

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

我必须执行任何操作才能初始化此值吗?我们有一个庞大的代码库,我不知道其间会发生什么。

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

谢谢。

_get_timezone((返回Redmond默认值28800(太平洋标准时间(,然后再调用_tzset((_tzset((将被许多基于时间的函数隐式调用(然而,localtime/mktime似乎不会调用它(。

我也遇到了一个问题,它没有初始化,或者它被初始化,然后翻回到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;

我会定义自己的函数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);
}

这是从这里拿走的希望这能帮助