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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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