2009-12-23 7 views
19

C'è un modo per ottenere millisecondi e la sua frazione dal 1970 usando time.h in linguaggio c?Come posso ottenere UTCTime in millisecondi dal 1 gennaio 1970 in linguaggio c

+0

Non è possibile ottenere la parte frazione in modo indipendente dalla piattaforma. Su quale piattaforma ti stai concentrando? – dalle

+0

Sto seguendo lo standard di ANSI C, in modo che la mia applicazione sia indipendente dalla piattaforma. Attualmente sono sulla piattaforma della finestra. – Siddiqui

risposta

32

questo funziona su Ubuntu Linux:

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à sul sito TimestampConvert.com dove è possibile immettere il valore per ottenere il tempo equivalente leggibile dall'uomo (anche se senza precisione millisecondo).

1

Unix time or Posix time è il tempo in secondi dall'epoca che hai menzionato.

bzabhi La risposta è corretta: basta moltiplicare il timestamp Unix per 1000 per ottenere i millisecondi.

Tenere presente che tutti i valori di millisecondo restituiti facendo affidamento sul timestamp Unix saranno multipli di su 1000 (come 12345678000). La risoluzione è ancora solo 1 secondo.

Non si può ottenere la parte frazionaria

Il commento di Pavel è corretta anche. Il timestamp Unix non tiene conto dei secondi intercalari. Ciò rende ancora meno saggio fare affidamento su una conversione in millisecondi.

+0

Qualsiasi altra libreria che può ottenere il millisecondo esatto inclusa la sua parte frazione ????? – Siddiqui

+0

Il timestamp Unix è fondamentale quanto possiamo. Deve essere che i progettisti di Unix pensassero che una seconda risoluzione fosse sufficiente. Poi di nuovo il sovraccarico di mantenere una risoluzione di 1 ms era probabilmente al di là dei primi sistemi Unix. – pavium

6

Non è standard C, ma gettimeofday() è presente nei sistemi derivati ​​SysV e BSD ed è in POSIX. Restituisce il tempo da quando l'epoca in un struct timeval:

struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    suseconds_t tv_usec; /* microseconds */ 
}; 
9

Se volete risoluzione millisecondo, è possibile utilizzare gettimeofday() in Posix. Per un'implementazione di Windows, vedi gettimeofday function for windows.

#include <sys/time.h> 

... 

struct timeval tp; 
gettimeofday(&tp); 
long int ms = tp.tv_sec * 1000 + tp.tv_usec/1000; 
+3

Probabilmente dovrebbe essere 'gettimeofday (& tv, NULL)' – puk

+1

Il link nella risposta è morto. Il dominio non esiste – owacoder

1
// 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; 
Problemi correlati