C++11 faktisk systemtid med millisekunder

C++11 faktisk systemtid med millisekunder

Använder kod från detta svar:

#include <chrono>
#include <ctime>
#include <iostream>

template <typename Duration>
void print_time(tm t, Duration fraction) {
    using namespace std::chrono;
    std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u]\n", t.tm_year + 1900,
                t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
                static_cast<unsigned>(fraction / milliseconds(1)));

    // VS2013's library has a bug which may require you to replace
    // "fraction / milliseconds(1)" with
    // "duration_cast<milliseconds>(fraction).count()"
}

int main() {
    using namespace std;
    using namespace std::chrono;

    system_clock::time_point now = system_clock::now();
    system_clock::duration tp = now.time_since_epoch();

    tp -= duration_cast<seconds>(tp);

    time_t tt = system_clock::to_time_t(now);

    print_time(*gmtime(&tt), tp);
    print_time(*localtime(&tt), tp);
}

En sak att tänka på är att det faktum att timern returnerar värden på submillisekunders valörer inte nödvändigtvis indikerar att timern har submillisekunderupplösning. Jag tror att Windows implementering i VS2015 äntligen kan fixas, men timern de har använt för att backa upp sin chrono-implementering hittills har varit känslig för OS timeBeginPeriod() inställning, visar varierande upplösning, och standardinställningen är tror jag 16 millisekunder.

Ovanstående kod förutsätter också att varken UTC eller din lokala tidszon är förskjutna från epoken std::chrono::system_clock med ett bråkdelssekundvärde.

Exempel på hur Howards datumfunktioner används för att undvika ctime:http://coliru.stacked-crooked.com/a/98db840b238d3ce7


Det här svaret använder fortfarande lite C API men används bara i funktionen, så du kan glömma det:

template<typename T>
void print_time(std::chrono::time_point<T> time) {
    using namespace std;
    using namespace std::chrono;

    time_t curr_time = T::to_time_t(time);
    char sRep[100];
    strftime(sRep,sizeof(sRep),"%Y-%m-%d %H:%M:%S",localtime(&curr_time));

    typename T::duration since_epoch = time.time_since_epoch();
    seconds s = duration_cast<seconds>(since_epoch);
    since_epoch -= s;
    milliseconds milli = duration_cast<milliseconds>(since_epoch);

    cout << '[' << sRep << ":" << milli.count() << "]\n";
}

Detta är bara en omskrivning av koden som bames53, men använder strftime för att förkorta koden lite.