Search code examples
c++c++11c++-chronosystem-clockgettimeofday

getting chrono time in specific way


I have following C code:

uint64_t combine(uint32_t const sec, uint32_t const usec){
    return (uint64_t) sec << 32 | usec;
};

uint64_t now3(){
    struct timeval tv;

    gettimeofday(&tv, NULL);

    return combine((uint32_t) tv.tv_sec, (uint32_t) tv.tv_usec);
}

What this do it combine 32 bit timestamp, and 32 bit "something", probably micro/nanoseconds into single 64 bit integer.

I have really hard time to rewrite it with C++11 chrono.

This is what I did so far, but I think this is wrong way to do it.

auto tse = std::chrono::system_clock::now().time_since_epoch();
auto dur = std::chrono::duration_cast<std::chrono::nanoseconds>( tse ).count();
uint64_t time = static_cast<uint64_t>( dur );

Important note - I only care about first 32 bit to be "valid" timestamp.

Second 32 bit "part" can be anything - nano or microseconds - everything is good as long as two sequential calls of this function give me different second "part".


Solution

  • i want seconds in one int, milliseconds in another.

    Here is code to do that:

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        auto now = std::chrono::system_clock::now().time_since_epoch();
        std::cout << now.count() << '\n';
        auto s = std::chrono::duration_cast<std::chrono::seconds>(now);
        now -= s;
        auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now);
        int si = s.count();
        int msi = ms.count();
        std::cout << si << '\n';
        std::cout << msi << '\n';
    }
    

    This just output for me:

    1447109182307707
    1447109182
    307