2013-11-26 2 views
-2

Мне нужна функция или библиотека, чтобы получить текущее системное время в миллисекундах с 1/1/1970 (C++)?Как получить текущее системное время в миллисекундах с 1/1/1970 (C++)

Мне нужно получить двойное число без знака, содержащее миллисекунды с 1/1/1970.

Операционная система - Windows.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Необходимость синхронизации приложения сервера и клиента. Клиент является мастером. Клиент сообщает серверу, когда ему нужно что-то сделать. После этого сервер работает сам по себе. Я отправляю метку времени от клиента, которая содержит текущее системное время до уровня миллисекунды. Сервер, получивший это сообщение, должен сделать то же самое. Он должен получить отметку времени, и разница будет равна миллисекундам, чтобы скорректировать ее временную шкалу. Это вопрос о том, как синхронизировать с процессом, чтобы выполнять некоторые связанные работы в одно и то же время.

НЕ ХОТИТЕ ИСПОЛЬЗОВАТЬ BOOST, ЕСЛИ ЭТО ВОЗМОЖНО!

+0

Uuuuuh, что будет большим достоинством! –

+0

Нет такой вещи, как unsigned double – JustSid

+0

OK. Меня не интересует двойник без знака, но он должен содержаться полностью. – Patrik

ответ

3

Вы можете использовать GetSystemTimeAsFileTime, чтобы получить текущее время как FILETIME. Создайте SYSTEMTIME, представляющий желаемую эпоху (1/1/1970) и позвоните по номеру SystemTimeToFileTime, чтобы преобразовать ее в FILETIME. Вычтите два FILETIME s и установите требуемую точность (от 100 нс до единиц 1 мс).

Это даст вам текущее время по UTC. Если вам нужно местное время, вам нужно будет преобразовать в местное время, используя, например, SystemTimeToTzSpecificLocalTime.

+0

Я достиг своей цели с помощью временных функций FILETIME. Были некоторые трудности с летним днем, но все остальное работало отлично. – Patrik

1

Проверьте это std::clock(), он должен иметь функциональность, необходимую для подсчета миллисекунд.

Еще одна вещь, которую нужно искать - это эпоха.

+0

'clock()' возвращает количество прошедшего времени с момента запуска процесса (по крайней мере, с реализацией Visual C++). –

+0

Просто рекомендуем использовать материал из 'std :: chrono' и некоторых указателей, чтобы улучшить ваш ответ. –

0

В Windows используется GetSystemTime. Вот ссылка на MSDN

Вам нужно суммировать компоненты, но это тривиальная :)

+1

Подводить итог недостаточно. Не знаете, как рассчитать Год в секундах. Также нужно учитывать високосные годы. 365/366 дней ... – Patrik

2

Это не предусмотрено стандартом, но я понимаю, что все основные реализации std::chrono::system_clock используют 1970-1-1 как эпоху и, как правило, имеют разрешение не менее миллисекунды. Поэтому на практике вы можете просто:

#include <chrono> 
#include <iostream> 

int main() { 
    auto now = std::chrono::system_clock::now(); 
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count() << '\n'; 
} 
+0

Это решение работает, но мне не разрешено использовать Boost. Это мои требования для клиентов. – Patrik

+1

@Patrik Это не форсирование, это C++ 11. Я считаю, что '' поддерживается в VS2010 и вперёд. – bames53

2

Вы можете использовать boost для получения вашего времени. boost/date_time/gregorian/gregorian.hpp предоставляет функцию date_duration(), которая может вычислять даты с 1400 года по сегодняшний день.

Смежные вопросы