我在尝试将程序从double转换为int时遇到错误。我想要的是不仅能够以秒为单位,而且可以以小时/分钟/秒为单位显示差异,但我想不出如何使difftime起作用。如果有更好的选择,例如使用chrono,我将不胜感激。
#include <chrono>
#include <ctime>
#include <iomanip>
#include <iostream>
int main() {
std::tm now{},;
std::chrono::system_clock::time_point cc;
std::cout << "enter\nyear month day\n";
std::cin >> now.tm_year >> now.tm_mon >> now.tm_mday;
now.tm_year -= 1900;
now.tm_mon -= 1;
std::time_t n = std::mktime(&now);
cc = std::chrono::system_clock::from_time_t(n);
n = std::chrono::system_clock::to_time_t(cc);
std::cout << std::put_time(std::localtime(&n), "%FT%T") << "\n";
std::time_t system_time = time(nullptr);
std::cout << asctime(localtime(&system_time));
double fc = difftime(system_time, mktime(&now));
std::cout << "time diff "<< fc << endl;
}
答案 0 :(得分:1)
您应该从Howard hinnant签出日期lib。 https://github.com/HowardHinnant/date 其中的tz lib可以进行本地时差计算,而无需将其转换为utc。 (由于夏令时,通常在计算前,您始终应转换为utc)。它还包含以小时/秒/秒格式流式传输的格式函数。
答案 1 :(得分:0)
更好的方法是使用 steady_clock 而不是 system_clock 。 我不知道您的任务是什么,但是您可以使用秒表之类的其他类来生成经过时间。
#include <chrono>
#include <ctime>
class StopWatch {
private:
chrono::time_point<chrono::steady_clock> start;
public:
void reset() { start = chrono::steady_clock::now(); }
StopWatch() { reset(); }
double elapsedSeconds() {
chrono::duration<double> d = chrono::steady_clock::now() - start;
return chrono::duration_cast<chrono::microseconds>(d).count() / 1000000.;
}};
之后,您只需使用秒表即可:
int main(void){
Stopwatch s;
cout<<s.elapsedSeconds();
}