C++ - 以 2 种不同的方式运行相同的 mktime() 逻辑,产生意外结果

C++ - Running same mktime() logic in 2 different ways giving unexpected result

提问人:10may 提问时间:10/9/2023 最后编辑:10may 更新时间:10/9/2023 访问量:41

问:

我正在使用 strptime() 和 mktime 将字符串中的时间转换为长时间。奇怪的是,以两种不同的方式使用相同的代码会产生不同的结果。不过,在这两种情况下,struct tm 的值是相同的。

请告诉我我做错了什么。

类型 1

int main()
{
    string time = "2023-03-02 00:00:00";
    struct tm tm;
    strptime(time.c_str(), "%Y-%d-%m %H:%M:%S", &tm);   //it is supposed to give you value decreased by 1900 so if it gives you 113 it means the year is 2013. Month will also be decreased by 1, i.e. if it gives you 1, it is actually February. Just add these values:
    //mktime expects the value given by strptime itslf. No need to do any modifications.
    time_t t = mktime(&tm);
    cout<<"tm_sec: "<<tm.tm_sec<<endl;
    cout<<"tm_min: "<<tm.tm_min<<endl;
    cout<<"tm_hour: "<<tm.tm_hour<<endl;
    cout<<"tm_mday: "<<tm.tm_mday<<endl;
    cout<<"tm_mon: "<<tm.tm_mon<<endl;
    cout<<"tm_year: "<<tm.tm_year<<endl;    
    cout<<"tm_wday: "<<tm.tm_wday<<endl;
    cout<<"tm_yday: "<<tm.tm_yday<<endl;
    cout<<"tm_isdst: "<<tm.tm_isdst<<endl;
    cout<<t<<endl;
    return 0;
}

这将按预期运行 (t=1675382400)

类型 2

time_t convert_datetime_string_to_long_time(string time)
    {
        //convert string time to long unix time
        struct tm tm;
        strptime(time.c_str(), "%Y-%d-%m %H:%M:%S", &tm);   //it is supposed to give you value decreased by 1900 so if it gives you 113 it means the year is 2013. Month will also be decreased by 1, i.e. if it gives you 1, it is actually February. Just add these values:
        //mktime expects the value given by strptime itslf. No need to do any modifications.
        
        cout<<"tm_sec: "<<tm.tm_sec<<endl;
        cout<<"tm_min: "<<tm.tm_min<<endl;
        cout<<"tm_hour: "<<tm.tm_hour<<endl;
        cout<<"tm_mday: "<<tm.tm_mday<<endl;
        cout<<"tm_mon: "<<tm.tm_mon<<endl;
        cout<<"tm_year: "<<tm.tm_year<<endl;    
        cout<<"tm_wday: "<<tm.tm_wday<<endl;
        cout<<"tm_yday: "<<tm.tm_yday<<endl;

        time_t t = mktime(&tm);
        return t;
    }
int main() {
    time_t ans = convert_datetime_string_to_long_time("2023-03-02 00:00:00");
    cout<<ans<<endl;

    return 0;
}

这里的 ans =-1

这怎么可能???

C++ 函数 datetime time mktime

评论

0赞 Iłya Bursov 10/9/2023
第一个函数打印time_t,第二个函数打印长
0赞 10may 10/9/2023
time_t很长。无论如何,我尝试返回time_t并打印它,但得到相同的结果

答:

1赞 Ted Lyngmo 10/9/2023 #1

tm未初始化,并且您只初始化部分字段。 正在读取未初始化的字段,这使得程序具有未定义的行为。mktime

确保初始化它以获得预期的结果:

struct tm tm{}; // <- now initialized
// or:
struct tm tm{.tm_isdst = -1};

注意:该函数应返回 ,而不是 .std::time_tlong

评论

0赞 10may 10/9/2023
初始化结构解决了问题。谢谢!但是,问题应该出在两种类型的运行中,对吗?(类型 1 和类型 2)。为什么只有一种类型的代码会产生意想不到的结果?此外,返回 time_t 给出的结果与返回 long 的结果相同(time_t 仅表示 long)
1赞 Ted Lyngmo 10/9/2023
@10may 是的,这两个程序都有未定义的行为。未定义的行为不需要在两个不同的程序中以相同的方式表现出来,甚至不需要在同一个程序中表现出来。回复:它可能在您的平台上,但它可能是其他平台上的其他内容。为了便携性,最好坚持使用 .time_tlongstd::time_t