Есть ли способ получить миллисекунды и их дробную часть с 1970 года, используя time.h на языке c?
Как я могу получить UTCTime в миллисекундах с 1 января 1970 года на языке c
Ответы (6)
Это работает в 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;
gettimeofday (&tv, NULL)
- person puk; 06.11.2013
Это не стандартный C, но gettimeofday()
присутствует как в системах, производных от SysV, так и в BSD, а также в POSIX. Он возвращает время с эпохи в struct timeval
:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Для Unix и Linux вы можете использовать gettimeofday.
Для Win32 вы можете использовать GetSystemTimeAsFileTime а затем преобразовать его в time_t + миллисекунды:
void FileTimeToUnixTime(FILETIME ft, time_t* t, int* ms)
{
LONGLONG ll = ft.dwLowDateTime | (static_cast<LONGLONG>(ft.dwHighDateTime) << 32);
ll -= 116444736000000000;
*ms = (ll % 10000000) / 10000;
ll /= 10000000;
*t = static_cast<time_t>(ll);
}
время Unix или время Posix — это время в секундах с начала эпохи ты упомянул.
Ответ bzabhi правильный: вы просто умножаете временную метку Unix на 1000, чтобы получить миллисекунды.
Имейте в виду, что все значения в миллисекундах, возвращаемые с использованием метки времени Unix, будут кратны 1000 (например, 12345678000). Разрешение по-прежнему составляет всего 1 секунду.
Вы не можете получить дробную часть
Комментарий от Павла тоже правильный. Отметка времени Unix не учитывает високосные секунды. Это делает еще менее разумным полагаться на преобразование в миллисекунды.