gpt4 book ai didi

c++ - 从 time_t 转换为 tm 然后再转换回 time_t 时出现问题

转载 作者:行者123 更新时间:2023-11-27 22:36:44 26 4
gpt4 key购买 nike

我的 time_t 值为 1530173696,代表 2018 年 6 月 28 日,星期四 8:14:56 AM

我想将时间向下舍入到最接近的小时。具体来说,向下到 1530172800,代表 Thursday, June 28, 2018 8:00:00 AM。因此,我的想法是将此 time_t 转换为 tm 结构,然后为其分配 secmin 值到 0

但是,在我这样做之后,并且在我将修改后的 tm 转换回 time_t 值之后,我得到的值已经偏离了。我得到一个 1530158400 值,它表示 2018 年 6 月 28 日星期四凌晨 4:00:00。那是4个小时的休息时间。即使检查小于 8:59:59 AM 的值,仍会给出 4:00:00 AM 的舍入值。

我写了下面的代码来演示这个问题。我使用 VisulStudio 2017。

我不明白我做错了什么。我感谢任何帮助。谢谢。

#include <iostream>
#include <time.h>

bool equalTMs(tm& tm1, tm& tm2);
void printTM(tm& myTM);

int main()
{
tm myTM;
time_t datetime = 1530173696;
//datetime = 1530176399; // to check the time_t value of 8:59 AM
gmtime_s(&myTM, &datetime);
myTM.tm_sec = 0;
myTM.tm_min = 0;
time_t myTime_T = mktime(&myTM);

tm sanityCheckTM;
time_t roundedDownToNearestHour = 1530172800;
gmtime_s(&sanityCheckTM, &roundedDownToNearestHour);
time_t sanityCheckTimeT = mktime(&sanityCheckTM);

std::cout << "datetime: " << datetime << std::endl;
std::cout << "myTime_T: " << myTime_T << std::endl;
std::cout << std::endl;
std::cout << "roundedDownToNearestHour: " << roundedDownToNearestHour << std::endl;
std::cout << "sanityCheckTimeT: " << sanityCheckTimeT << std::endl;
std::cout << std::endl;
std::cout << "myTM and sanityCheckTM equal? " << (equalTMs(myTM, sanityCheckTM) ? "true" : "false") << std::endl;

std::cout << "\nmyTM:-\n\n";
printTM(myTM);
std::cout << "\nsanityCheckTM:-\n\n";
printTM(sanityCheckTM);
std::cout << "\n";

time_t _time_t = 1530158400;
tm _tm;
gmtime_s(&_tm, &_time_t);
std::cout << "_time_t: " << _time_t << std::endl;
std::cout << "_tm and sanityCheckTM equal? " << (equalTMs(_tm, sanityCheckTM) ? "true" : "false") << std::endl;

std::cout << "\n_tm:-\n\n";
printTM(_tm);

}

void printTM(tm& myTM)
{
std::cout << "tm_sec: " << myTM.tm_sec << std::endl;
std::cout << "tm_min: " << myTM.tm_min << std::endl;
std::cout << "tm_hour: " << myTM.tm_hour << std::endl;
std::cout << "tm_mday: " << myTM.tm_mday << std::endl;
std::cout << "tm_mon: " << myTM.tm_mon << std::endl;
std::cout << "tm_year: " << myTM.tm_year << std::endl;
std::cout << "tm_wday: " << myTM.tm_wday << std::endl;
std::cout << "tm_yday: " << myTM.tm_yday << std::endl;
std::cout << "tm_isdst: " << myTM.tm_isdst << std::endl;
}

bool equalTMs(tm& tm1, tm& tm2)
{
return (tm1.tm_sec == tm2.tm_sec)
&& (tm1.tm_min == tm2.tm_min)
&& (tm1.tm_hour == tm2.tm_hour)
&& (tm1.tm_mday == tm2.tm_mday)
&& (tm1.tm_mon == tm2.tm_mon)
&& (tm1.tm_year == tm2.tm_year)
&& (tm1.tm_wday == tm2.tm_wday)
&& (tm1.tm_yday == tm2.tm_yday)
&& (tm1.tm_isdst == tm2.tm_isdst);
}

最佳答案

gmtime_s() 返回以 UTC 时间 表示的 tm。您将其传递给 mktime(),它期望 tm 改为以 LOCAL time 表示。您的 StackOverflow 个人资料显示您位于阿布扎比,时区为 GMT+4。这就是为什么会有 4 小时的差异。

使用 localtime_s() 而不是 gmtime_s()

关于c++ - 从 time_t 转换为 tm 然后再转换回 time_t 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215934/

26 4 0