用 tm 添加和减去时间

Zev*_*san 3 c++ time time-t

假设我将 tm 中的时间设置为 23:00:00

ptm->tm_hour = 23; ptm->tm_min = 0; ptm->tm_sec = 0;
Run Code Online (Sandbox Code Playgroud)

我想允许用户从中减去时间

ptm->tm_hour -= hourinput; ptm->tm_min -= minuteinput; ptm->tm_sec -= secondinput;
Run Code Online (Sandbox Code Playgroud)

如果用户减去 0 小时 5 分 5 秒,则不会显示为 22:54:55,而是显示为 23:-5:-5。

我想我可以做一堆 if 语句来检查 ptm 是否低于 0 并解释这一点,但是有没有更有效的方法来获得正确的时间?

Bla*_*aze 5

是的,你可以用std::mktime这个。它不仅将 a 转换std::tm为 a std::time_t,还可以修复tm某些字段超出范围的情况。考虑这个例子,我们将当前时间加上 1000 秒。

#include <iostream>
#include <iomanip> // put_time
#include <ctime>

int main(int argc, char **argv) {
    std::time_t t = std::time(nullptr);
    std::tm tm = *std::localtime(&t);
    std::cout << "Time: " << std::put_time(&tm, "%c %Z") << std::endl;
    tm.tm_sec += 1000; // the seconds are now out of range
    //std::cout << "Time in 1000 sec" << std::put_time(&tm, "%c %Z") << std::endl; this would crash!
    std::mktime(&tm); // also returns a time_t, but we don't need that here
    std::cout << "Time in 1000 sec: " << std::put_time(&tm, "%c %Z") << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的输出:

时间: 01/24/19 09:26:46 欧洲西部标准时间

时间(1000 秒): 01/24/19 09:43:26 欧洲西部标准时间

正如您所看到的,时间从09:26:4609:43:26