Как я могу получить UTCTime в миллисекундах с 1 января 1970 года на языке c

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

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Это работает в 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 веб-сайт, где вы можете ввести значение, чтобы получить обратно эквивалентное время, доступное для чтения человеком (хотя и без точности в миллисекунду).

Другие советы

Если вам нужно разрешение в миллисекундах, вы можете использовать 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;

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

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

Для Unix и Linux вы могли бы использовать начало дня.

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

    // 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;

Время Unix или Posix есть ли время в секунды с той эпохи, о которой вы упомянули.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top