我正在尝试更正一个非常奇怪的时间戳类。 它必须做的是获得施工时的当前时间或作为字符串传递的时间。
我只想使用UTC,因为这些日期并没有真正显示在任何地方,只是一个时间戳与另一个时间戳之间的差异是。
在任何情况下,我都会调用strptime(timestamp, m_format.c_str(), &time);
从字符串中获取tm时间。这个字符串是UTC时间,所以如果我想调用mktime
来获取time_t时间,我必须用当前时区修改它,所以我这样做time.tm_hour-=tz/3600
通过调用tz
来检索_get_timezone
{1}}。问题是这个函数似乎返回28800这是默认值但是如果我稍后在代码中调用它会给我-7200这是正确的值。
我是否必须做任何事情才能初始化此值?我们有一个很大的代码库,我不知道两者之间发生的一切。
此外,如果有人有类似课程的链接,我会非常感激,因为我可能会注意到我的错误。
谢谢。
答案 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 希望这有帮助