У меня проблемы с созданием точки времени - и как представить наносекунды ... Она отлично работает с микроэлементами.
Это говорит мне о том, что ваш system_clock::time_point
имеет точность грубее наносекунд (на 1 кв. м микросекунды, на Windows, 1/10 мкс). Самый простой способ добавить наносекунды к такому time_point
:
auto tp = temp_time_point + nanoseconds (nsecs);
. Это формирует time_point
, который все еще основан на system_clock
, но имеет точность "общего типа" * 1012. * и nanoseconds
, что на практике будет просто nanoseconds
.
при условии, что все метки времени указаны по Гринвичу, UT C + 0
Теперь проблема является то, что mktime
преобразуется из локального tm
в UT C time_t
. Но вы хотите преобразовать тип поля UT C в тип последовательного UT C.
Это легко сделать в C ++ 20 (я знаю, у вас его еще нет, выслушайте меня):
#include <chrono>
#include <iostream>
#include <sstream>
std::chrono::sys_time<std::chrono::nanoseconds>
XXXXX(std::string const& timestamp)
{
using namespace std;
using namespace std::chrono;
istringstream temp_ss{timestamp};
sys_time<nanoseconds> tp;
temp_ss >> parse("%F %T", tp);
return tp;
}
int
main()
{
auto tp = XXXXX("2018-10-01 00:06:16.700000000");
std::cout << tp.time_since_epoch().count() << "ns\n";
std::string s = std::format("{:%F %T}", tp);
std::cout << s << '\n';
}
Это преобразует string
в chrono::time_point<system_clock, nanoseconds>
, что, очевидно, отличается от вашего system_clock::time_point
только тем, что ваш system_clock::time_point
имеет точность более грубую, чем nanoseconds
.
Затем format
используется для преобразования time_point
обратно в string
.
Вывод:
1538352376700000000ns
2018-10-01 00:06:16.700000000
Теперь я знаю, что полностью соответствующий C ++ 20 <chrono>
это редкая вещь в наши дни (она наступает). До тех пор, пока он не появится, существует C ++ 20 <chrono>
библиотека предварительного просмотра , которая совместима с C ++ 11. Это бесплатно и с открытым исходным кодом. И требует очень мало изменений syntacti c:
#include "date/date.h"
#include <chrono>
#include <iostream>
#include <sstream>
date::sys_time<std::chrono::nanoseconds>
XXXXX(std::string const& timestamp)
{
using namespace date;
using namespace std;
using namespace std::chrono;
istringstream temp_ss{timestamp};
sys_time<nanoseconds> tp;
temp_ss >> parse("%F %T", tp);
return tp;
}
int
main()
{
using namespace date;
auto tp = XXXXX("2018-10-01 00:06:16.700000000");
std::cout << tp.time_since_epoch().count() << "ns\n";
std::string s = format("%F %T", tp);
std::cout << s << '\n';
}
Выход:
1538352376700000000ns
2018-10-01 00:06:16.700000000