W Javie możemy użyć System.currentTimeMillis()
do uzyskania aktualnego znacznika czasu w milisekundach od czasu epoki, który wynosi -
różnica, mierzona w milisekundach, między aktualnym czasem a północą 1 stycznia 1970 UTC.
W C ++ jak uzyskać to samo?
Obecnie używam tego, aby uzyskać aktualną sygnaturę czasową -
struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds
cout << ms << endl;
To wygląda dobrze czy nie?
steady_clock
zawsze będzie postępować naprzód, jest to prawdziwa miara czasu od jego epoki, podczas gdysystem_clock
może być reprezentacją logicznego czasu od tej epoki. Z każdą sekundą przeskokową te dwa mogą się bardziej oddalać w zależności od implementacji systemu.system_clock
być taka sama jak w epoce UNIX, ale specyfikacja mówi tylko, że musi to być systemowy zegar ścienny czasu rzeczywistego. Nie ma wymogu,steady_clock
aby pasował do rzeczywistości, tylko że idzie do przodu.timeval
struktur jest denerwujące).posługiwać się
<sys/time.h>
struct timeval tp; gettimeofday(&tp, NULL); long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
odnieś to .
źródło
Ta odpowiedź jest bardzo podobna do tej z Oz. , Używając
<chrono>
dla C ++ - nie pobrałem jej z Oz. chociaż...Podniosłem oryginalny fragment u dołu tej strony i nieznacznie zmodyfikowałem go, aby był kompletną aplikacją konsolową. Uwielbiam używać tej lil 'starej rzeczy. To fantastyczne, jeśli wykonujesz dużo skryptów i potrzebujesz niezawodnego narzędzia w systemie Windows, aby uzyskać epokę w rzeczywistych milisekundach bez uciekania się do używania VB lub mniej nowoczesnego, mniej przyjaznego dla czytelnika kodu.
#include <chrono> #include <iostream> int main() { unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); std::cout << now << std::endl; return 0; }
źródło
-560549313
to nie jest prawda, prawda?int
!int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
. Przerzuciłem to naint64_t
i działa! Dziękuję bardzo za prośbę o więcej informacji!unsigned long long
jest bardziej przenośny i__int64
jest dostępny tylko na MSVC.__int64
typu w standardowym C ++.std::int64_t
Zamiast tego można użyć .Od C ++ 11 możesz używać
std::chrono
:std::chrono::system_clock::now()
.time_since_epoch()
duration_cast<milliseconds>(d)
std::chrono::milliseconds
na liczbę całkowitą (uint64_t
aby uniknąć przepełnienia)#include <chrono> #include <cstdint> #include <iostream> uint64_t timeSinceEpochMillisec() { using namespace std::chrono; return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); } int main() { std::cout << timeSinceEpochMillisec() << std::endl; return 0; }
źródło
unsigned long long
zamiastuint64_t
.unsigned long long
zamiastuint64_t
? Mam naturalną wolę pisania krótszychJeśli używasz gettimeofday, musisz rzucać zbyt długo, w przeciwnym razie wystąpią przepełnienia, a tym samym nie rzeczywista liczba milisekund od epoki: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; poda Ci liczbę taką jak 767990892, czyli około 8 dni po epoce ;-).
int main(int argc, char* argv[]) { struct timeval tp; gettimeofday(&tp, NULL); long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds std::cout << mslong << std::endl; }
źródło
Uwzględnij
<ctime>
i używajtime
funkcji.źródło