gpt4 book ai didi

c++ - mktime() 函数 : increasing tm_hour count by one 的令人困惑的行为

转载 作者:IT老高 更新时间:2023-10-28 23:14:12 24 4
gpt4 key购买 nike

我正在执行下面的代码。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com