Come posso ottenere l'ora UTC in millisecondi dal 1 gennaio 1970 in linguaggio C
Domanda
Esiste un modo per ottenere millisecondi e la sua frazione dal 1970 utilizzando time.h in linguaggio c?
Soluzione
Questo funziona su Ubuntu Linux:
#include <sys/time.h>
...
struct timeval tv;
gettimeofday(&tv, NULL);
unsigned long long millisecondsSinceEpoch =
(unsigned long long)(tv.tv_sec) * 1000 +
(unsigned long long)(tv.tv_usec) / 1000;
printf("%llu\n", millisecondsSinceEpoch);
Al momento in cui scriviamo, il printf () di cui sopra mi sta dando 1338850197035. È possibile fare un controllo di integrità al sito TimestampConvert.com in cui è possibile inserire il valore per ottenere indietro il tempo leggibile equivalente (anche se senza precisione micrometrica).
Altri suggerimenti
Se si vuole la risoluzione millisecondo, è possibile utilizzare gettimeofday () in Posix. Per un'implementazione di Windows vedere gettimeofday funzione per le finestre .
#include <sys/time.h>
...
struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
Non è C standard, ma gettimeofday()
è presente sia nei sistemi derivati da SysV che in BSD ed è in POSIX.Restituisce il tempo trascorso dall'epoca in a struct timeval
:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Per Unix e Linux è possibile utilizzare gettimeofday .
Per Win32 è possibile utilizzare GetSystemTimeAsFileTime e quindi convertirlo in time_t + millisecondi .
// the system time
SYSTEMTIME systemTime;
GetSystemTime( &systemTime );
// the current file time
FILETIME fileTime;
SystemTimeToFileTime( &systemTime, &fileTime );
// filetime in 100 nanosecond resolution
ULONGLONG fileTimeNano100;
fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;
//to milliseconds and unix windows epoche offset removed
ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000;
return posixTime;
volta Unix o tempo Posix è il tempo in secondi dall'epoca lei ha citato.
bzabhi s ' risposta è corretta:. È sufficiente moltiplicare il timestamp Unix per 1000 per ottenere millisecondi
Essere consapevoli del fatto che tutti i valori restituiti dalla millisecondi basandosi sulla timestamp Unix sarà multipli di 1000 (come 12.345,678 milioni). La risoluzione è ancora solo 1 secondo.
non è possibile ottenere la parte frazionaria
Il commento di Pavel è anche corretto. Il timestamp Unix non tiene conto secondi bisestili . Questo rende ancora meno saggio fare affidamento su una conversione in millisecondi.