Get Unix timestamp with C++

后端 未结 7 556
南旧
南旧 2020-12-02 20:00

How do I get a uint unix timestamp in C++? I\'ve googled a bit and it seems that most methods are looking for more convoluted ways to represent time. Can\'t I j

相关标签:
7条回答
  • 2020-12-02 20:09

    As this is the first result on google and there's no C++20 answer yet, here's how to use std::chrono to do this:

    #include <chrono>
    
    //...
    
    using namespace std::chrono;
    int64_t timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
    

    In versions of C++ before 20, system_clock's epoch being Unix epoch is a de-facto convention, but it's not standardized. If you're not on C++20, use at your own risk.

    0 讨论(0)
  • 2020-12-02 20:12
    #include <iostream>
    #include <sys/time.h>
    
    using namespace std;
    
    int main ()
    {
      unsigned long int sec= time(NULL);
      cout<<sec<<endl;
    }
    
    0 讨论(0)
  • 2020-12-02 20:19
    #include<iostream>
    #include<ctime>
    
    int main()
    {
        std::time_t t = std::time(0);  // t is an integer type
        std::cout << t << " seconds since 01-Jan-1970\n";
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-02 20:21

    Windows uses a different epoch and time units: see Convert Windows Filetime to second in Unix/Linux

    What std::time() returns on Windows is (as yet) unknown to me (;-))

    0 讨论(0)
  • 2020-12-02 20:23

    I created a global define with more information:

    #include <iostream>
    #include <ctime>
    #include <iomanip>
    
    #define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)    // only show filename and not it's path (less clutter)
    #define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
    #define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
    
    static std::time_t time_now = std::time(nullptr);
    

    Use it like this:

    INFO << "Hello world" << std::endl;
    ERROR << "Goodbye world" << std::endl;
    

    Sample output:

    16-06-23 21:33:19 [INFO] main.cpp(main:6) >> Hello world
    16-06-23 21:33:19 [ERROR] main.cpp(main:7) >> Goodbye world
    

    Put these lines in your header file. I find this very useful for debugging, etc.

    0 讨论(0)
  • 2020-12-02 20:24

    The most common advice is wrong, you can't just rely on time(). That's used for relative timing: ISO C++ doesn't specify that 1970-01-01T00:00Z is time_t(0)

    What's worse is that you can't easily figure it out, either. Sure, you can find the calendar date of time_t(0) with gmtime, but what are you going to do if that's 2000-01-01T00:00Z ? How many seconds were there between 1970-01-01T00:00Z and 2000-01-01T00:00Z? It's certainly no multiple of 60, due to leap seconds.

    0 讨论(0)
提交回复
热议问题