получать хронографическое время определенным образом

У меня есть следующий код C:

uint64_t combine(uint32_t const sec, uint32_t const usec){
return (uint64_t) sec << 32 | usec;
};

uint64_t now3(){
struct timeval tv;

gettimeofday(&tv, NULL);

return combine((uint32_t) tv.tv_sec, (uint32_t) tv.tv_usec);
}

Для чего он объединяет 32-битную временную метку и 32-битное «что-то», вероятно, микро / наносекунды в одно 64-битное целое число.

Мне очень трудно переписать его с C ++ 11 хроно.

Это то, что я сделал до сих пор, но я думаю, что это неправильный способ сделать это.

auto tse = std::chrono::system_clock::now().time_since_epoch();
auto dur = std::chrono::duration_cast<std::chrono::nanoseconds>( tse ).count();
uint64_t time = static_cast<uint64_t>( dur );

Важная заметка — Я забочусь только о том, чтобы первые 32 бита были «действительными» временными метками.

Вторая 32-битная «часть» может быть чем угодно — нано или микросекундами — все хорошо, если два последовательных вызова этой функции дают мне другую вторую «часть».

0

Решение

я хочу секунды в одном int, миллисекунды в другом.

Вот код для этого:

#include <chrono>
#include <iostream>

int
main()
{
auto now = std::chrono::system_clock::now().time_since_epoch();
std::cout << now.count() << '\n';
auto s = std::chrono::duration_cast<std::chrono::seconds>(now);
now -= s;
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now);
int si = s.count();
int msi = ms.count();
std::cout << si << '\n';
std::cout << msi << '\n';
}

Это просто вывод для меня:

1447109182307707
1447109182
307
1

Другие решения

Хронологические типы C ++ 11 используют только одно число для представления времени с данной эпохи, в отличие от timeval (или же timespec) структура, которая использует два числа для точного представления времени. Так что с C ++ 11 Chrono вам не нужно combine() метод.

Содержание метки времени, возвращенной now() зависит от используемых вами часов; есть часы на дереве, описанные в http://en.cppreference.com/w/cpp/chrono :

system_clock             wall clock time from the system-wide realtime clock
steady_clock             monotonic clock that will never be adjusted
high_resolution_clock    the clock with the shortest tick period available

Если вы хотите, чтобы последовательные метки времени всегда были разными, используйте постоянные часы:

auto t1 = std::chrono::steady_clock::now();
...
auto t2 = std::chrono::steady_clock::now();
assert (t2 > t1);

Изменить: ответ на комментарий

#include <iostream>
#include <chrono>
#include <cstdint>

int main()
{
typedef std::chrono::duration< uint32_t, std::ratio<1> > s32_t;
typedef std::chrono::duration< uint32_t, std::milli > ms32_t;

s32_t  first_part;
ms32_t second_part;

auto t1 = std::chrono::nanoseconds( 2500000000 ); // 2.5 secs

first_part  = std::chrono::duration_cast<s32_t>(t1);
second_part = std::chrono::duration_cast<ms32_t>(t1-first_part);

std::cout << "first part   = " << first_part.count() << " s\n"<< "seconds part = " << second_part.count() << " ms" << std::endl;

auto t2 = std::chrono::nanoseconds( 2800000000 ); // 2.8 secs

first_part  = std::chrono::duration_cast<s32_t>(t2);
second_part = std::chrono::duration_cast<ms32_t>(t2-first_part);

std::cout << "first part   = " << first_part.count() << " s\n"<< "seconds part = " << second_part.count() << " ms" << std::endl;
}

Выход:

first part   = 2 s
seconds part = 500 ms
first part   = 2 s
seconds part = 800 ms
1

По вопросам рекламы [email protected]