Come posso ottenere l'ora UTC in millisecondi dal 1 gennaio 1970 in linguaggio C

StackOverflow https://stackoverflow.com/questions/1952290

  •  21-09-2019
  •  | 
  •  

Domanda

Esiste un modo per ottenere millisecondi e la sua frazione dal 1970 utilizzando time.h in linguaggio c?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top