Есть ли способ получить миллисекунды и его фракционную часть с 1970 года, используя time.h на языке c?
Как я могу получить UTCTime в миллисекундах с 1 января 1970 года на языке 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 */
};
Ответ 4
Для Unix и Linux вы можете использовать gettimeofday.
Для Win32 вы можете использовать GetSystemTimeAsFileTime, а затем преобразовать его в time_t + миллисекунды.
Ответ 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 не учитывает секунды прыжка. Это делает менее разумным полагаться на преобразование в миллисекунды.