Прежде всего, если вы хотите получить разрешение в шесть десятичных знаков в текущую секунду, мы говорим о микросекундах (1us = 10E-6
), а не миллисекундах (1ms = 10E-3
). Кроме того, вам, вероятно, следует использовать std::chrono
, поскольку gettimeofday()
зависит от операционной системы Linux и не будет работать в других системах.
Для получения даты вы можете использовать <time.h>
и ее gmtime()
(UTC), которая возвращает struct tm
. Что касается времени, простой способ получить истекшее время после текущей секунды, в микросекундах (например, 14:31:09.590721
), заключается в использовании факта, что time_t
имеет разрешение всего 1 с:
#include <iostream>
#include <string>
#include <chrono>
#include <time.h>
int main() {
for (int i = 0; i < 1000; ++i) {
auto now = std::chrono::system_clock::now();
auto now_t = std::chrono::system_clock::to_time_t(now);
//Exploit now_t (time_t): resolution is only 1 second - get microseconds
auto dur = now - std::chrono::system_clock::from_time_t(now_t);
auto micros = std::chrono::duration_cast<std::chrono::microseconds>(dur).count();
//Print the date and time as yyyy-mm-dd hh::mm::ss.xxxxxx
tm& now_tm = *(gmtime(&now_t));
std::string year = std::to_string(now_tm.tm_year + 1900) + "-";
std::string mon = std::to_string(now_tm.tm_mon + 1) + "-";
std::string day = std::to_string(now_tm.tm_mday) + " ";
std::string hour = std::to_string(now_tm.tm_hour);
std::string min = std::to_string(now_tm.tm_min);
std::string sec = std::to_string(now_tm.tm_sec);
if (hour.size() == 1) hour.insert(0, "0");
if (min.size() == 1) min.insert(0, "0");
if (sec.size() == 1) sec.insert(0, "0");
std::cout << year << mon << day
<< hour << ":" << min << ":" << sec << "." << micros << "\n";
}
return 1;
}
Выполнение 10 итераций в моем часовом поясе дает:
2018-5-4 12:36:11.47578
2018-5-4 12:36:11.48663
2018-5-4 12:36:11.49516
2018-5-4 12:36:11.50392
2018-5-4 12:36:11.51261
2018-5-4 12:36:11.52455
2018-5-4 12:36:11.53316
2018-5-4 12:36:11.54213
2018-5-4 12:36:11.55113
2018-5-4 12:36:11.55969
PS: Когда вы находитесь на таком уровне детализации, вы должны знать точность / отклонение тактового источника . Это зависит от системы (hw, OS и т. Д.). Серьезное хронометраж требует специального оборудования (например, GPSDO) и программного обеспечения.