我如何使用ctime / chrono libaray将开始时间与系统时钟进行比较

时间:2019-11-22 21:29:55

标签: c++ c++11

我在尝试将程序从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;

}

2 个答案:

答案 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();
}