3

我正在尝试纠正一个表现得很奇怪的时间戳类。它所要做的是在构造时获取当前时间或作为字符串传递的时间。

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

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

我必须做任何事情来初始化这个值吗?我们有一个庞大的代码库,我不知道这之间发生的一切。

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

谢谢你。

4

2 回答 2

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;
于 2017-08-24T12:16:36.233 回答
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);
}

这是取自这里 希望这有帮助

于 2013-05-30T16:23:34.243 回答