我正在执行以下代码。

int main()
{
struct tm storage={0,0,0,0,0,0,0,0,0};
char *p = NULL;
p = (char *)strptime("2012-08-25 12:23:12","%Y-%m-%d %H:%M:%S",&storage);
char buff[1024]={0};
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
storage.tm_sec += 20;
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
mktime(&storage);
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
return 0;
}

如果执行了上述程序,它将打印“2012-08-25 13:23:32”而不是“2012-08-25 12:23:32”。请帮忙,为什么它会增加tm_hour值。
如果我在程序中将输入日期设置为“2012-02-25 12:23:32”,则此方法可以正常工作,这很令人困惑。

输出->
[user@rtpkvm55-vm2 root]$ ./a.out
2012-08-25 12:23:12
2012-08-25 12:23:32
2012-08-25 13:23:32
[user@rtpkvm55-vm2 root]$

我系统上的日期信息,->
[user@rtpkvm55-vm2 root]$ date
Sat Aug 25 08:28:26 EDT 2012

最佳答案

会发生什么

您指定的日期有效于夏令时,但调用mktime时,storage.tm_isdst为零。 mktime看到了这一点,并认为“嘿,他们给了我一个日期不正确的夏令时标记,让我们解决它”。然后将tm_isdst设置为1并更改tm_hour

另请参见this答案。

要修复它

  • 使用 timegm 代替mktime
  • 在调用mktime之前将时区设置为UTC(另请参见timegm的示例):

    setenv(“TZ”,“”,1);
    tzset();
    mktime();
  • 使用良好的日期时间库(如boost::locale::date_time/boost::date_time,但在选择一个库之前先阅读boost::locale::date_time页上的“问答”部分)

    关于c++ - mktime()函数: increasing tm_hour count by one的困惑行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12122084/

  • 10-14 13:42
    查看更多