Как я могу получить UTCTime в миллисекундах с 1 января 1970 года на языке c - PullRequest
21 голосов
/ 23 декабря 2009

Есть ли способ получить миллисекунды и их дробную часть с 1970 года, используя time.h на языке c?

Ответы [ 6 ]

36 голосов
/ 05 июня 2012

Это работает в 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);

На момент написания этой статьи приведенная выше функция printf () дала мне 1338850197035. Вы можете проверить работоспособность на веб-сайте TimestampConvert.com , где вы можете ввести значение, чтобы получить обратно эквивалентное человеческое число. -читаемое время (хотя и с точностью до миллисекунды).

9 голосов
/ 23 декабря 2009

Если вам нужно разрешение в миллисекундах, вы можете использовать gettimeofday () в Posix. Для реализации Windows см. Функцию gettimeofday для windows .

.
#include <sys/time.h>

...

struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;
6 голосов
/ 23 декабря 2009

Это не стандарт C, но gettimeofday() присутствует как в системах, производных от SysV и BSD, так и в POSIX. Возвращает время с эпохи в struct timeval:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
4 голосов
/ 23 декабря 2009

Для Unix и Linux вы можете использовать gettimeofday .

Для Win32 вы можете использовать GetSystemTimeAsFileTime и затем преобразовать его в time_t + миллисекунды .

2 голосов
/ 21 октября 2014
    // 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;
1 голос
/ 23 декабря 2009

Unix time или Posix time - это время в секундах с упомянутой вами эпохи.

bzabhi ответ правильный: вы просто умножаете метку времени Unix на 1000, чтобы получить миллисекунды.

Имейте в виду, что все значения в миллисекундах, возвращаемые с использованием метки времени Unix, будут кратны 1000 (например, 12345678000). Разрешение по-прежнему составляет всего 1 секунду.

Вы не можете получить дробную часть

Комментарий Павла также верен. Временная метка Unix не учитывает високосные секунды . Это делает еще менее разумным полагаться на преобразование в миллисекунды.

...