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 just get it as a uint?

7 Answers

C++20 introduced a guarantee that time_since_epoch is relative to the UNIX epoch, and cppreference.com gives an example that I've distilled to the relevant code, and changed to units of seconds rather than hours:

#include <iostream> #include <chrono> int main() { const auto p1 = std::chrono::system_clock::now(); std::cout << "seconds since epoch: " << std::chrono::duration_cast<std::chrono::seconds>( p1.time_since_epoch()).count() << '\n'; } 

Using C++17 or earlier, time() is the simplest function - seconds since Epoch, which for Linux and UNIX at least would be the UNIX epoch. Linux manpage here.

The cppreference page linked above gives this example:

#include <ctime> #include <iostream> int main() { std::time_t result = std::time(nullptr); std::cout << std::asctime(std::localtime(&result)) << result << " seconds since the Epoch\n"; } 
2
#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; } 
1

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.

5

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.

1
#include <iostream> #include <sys/time.h> using namespace std; int main () { unsigned long int sec= time(NULL); cout<<sec<<endl; } 
2

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.

3

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy