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

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


person Siddiqui    schedule 23.12.2009    source источник
comment
Вы не можете получить дробную часть независимым от платформы способом. На какую платформу вы ориентируетесь?   -  person dalle    schedule 23.12.2009
comment
Я следую стандарту ANSI C, поэтому мое приложение не зависит от платформы. В настоящее время я на оконной платформе.   -  person Siddiqui    schedule 23.12.2009


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

person stackoverflowuser2010    schedule 04.06.2012

Если вам нужно миллисекундное разрешение, вы можете использовать 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;
person Plow    schedule 23.12.2009
comment
Вероятно, это должно быть gettimeofday (&tv, NULL) - person puk; 06.11.2013
comment
Ссылка в ответе мертва. Домен не существует. - person owacoder; 11.09.2016

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

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
person caf    schedule 23.12.2009

Для 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);
}
person dalle    schedule 23.12.2009
comment
gettimeofday() делает то, что нужно. Вот пример кода: docs.hp.com/en/B9106 -90009/gettimeofday.2.html Итак, какие операционные системы пытается поддерживать Aman? - person tpgould; 23.12.2009
comment
Первая ссылка мертва. - person aioobe; 30.01.2019
comment
@aioobe Следовательно, почему это сайт политика, чтобы процитировать соответствующий отрывок (или обобщить) любую ссылку, которую вы включаете. - person Braden Best; 07.05.2019
comment
вторая ссылка мертва - person Richard McFriend Oluwamuyiwa; 22.02.2021

время Unix или время Posix — это время в секундах с начала эпохи ты упомянул.

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

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

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

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

person pavium    schedule 23.12.2009
comment
Любая другая библиотека, которая может получить точную миллисекунду, включая ее дробную часть????? - person Siddiqui; 23.12.2009
comment
Временная метка Unix настолько фундаментальна, насколько это возможно. Должно быть, разработчики Unix думали, что разрешения в одну секунду будет достаточно. С другой стороны, накладные расходы на поддержание разрешения в 1 мс, вероятно, были выше, чем в ранних системах Unix. - person pavium; 23.12.2009

person    schedule
comment
Как написать хороший ответ на вопрос? - Обмен метастеками. Ваш ответ, похоже, сильно зависит от конкретной ОС/среды (как насчет сред, отличных от POSIX?), и ему не хватает контекста. Например, POSIX cstdlib не использует имена типов с заглавными буквами для какого-либо из указанных типов данных — они должны были быть определены в другом месте. Похоже, вы используете библиотеку. Можно отметить, что этот ответ относится к системам класса X с библиотекой Y, хотя я не уверен, как это сделать с системой Z, но такие ответы только для кода вряд ли полезны. - person Braden Best; 07.05.2019