所以说我将tm中的时间设置为23:00:00
ptm->tm_hour = 23; ptm->tm_min = 0; ptm->tm_sec = 0;
我想允许用户从中减去时间
ptm->tm_hour -= hourinput; ptm->tm_min -= minuteinput; ptm->tm_sec -= secondinput;
如果用户减去0小时5分5秒,而不是显示为22:54:55,它将显示为23:-5:-5。
我想我可以做一堆if语句来检查ptm是否低于0并解决这个问题,但是有没有更有效的方法来获取适当的时间?
答案 0 :(得分:2)
是的,您可以使用std::mktime
。它不只是将std::tm
转换为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;
}
我的输出:
时间:19/24/19 09:26:46 W.欧洲标准时间
1000秒中的时间:欧洲标准时间01/24/19 09:43:26
如您所见,时间从09:26:46
到09:43:26
。
答案 1 :(得分:2)
这是使用Howard Hinnant's date library的另一种方法,它正在C ++ 2a中使用。
#include <iostream>
#include "date/date.h"
using namespace std::chrono_literals;
// Time point representing the start of today:
auto today = date::floor<date::days>(std::chrono::system_clock::now());
auto someTp = today + 23h; // Today, at 23h00
auto anotherTp = someTp - 5min - 5s; // ... should be self-explanatory now :)
std::cout << date::format("%b-%d-%Y %T\n", anotherTp);
如果要通过用户界面公开时间点的操作,则编译时构造23h
,5min
等当然不可用。这些文字构造了std::chrono::duration
对象,因此您需要一种将用户输入转换为等效实例的机制。