Метка времени C++ RFC3339 с миллисекундами с использованием std::chrono
Я создаю метку времени RFC3339, включая миллисекунды и UTC, в C++, используя std::chrono
вот так:
#include <chrono>
#include <ctime>
#include <iomanip>
using namespace std;
using namespace std::chrono;
string now_rfc3339() {
const auto now = system_clock::now();
const auto millis = duration_cast<milliseconds>(now.time_since_epoch()).count() % 1000;
const auto c_now = system_clock::to_time_t(now);
stringstream ss;
ss << put_time(gmtime(&c_now), "%FT%T") <<
'.' << setfill('0') << setw(3) << millis << 'Z';
return ss.str();
}
// output like 2019-01-23T10:18:32.079Z
(прости using
s)
Есть ли более прямой способ получить миллисекунды now
? Это кажется несколько громоздким %1000
now
в миллисекундах, чтобы добраться туда. Или любые другие комментарии о том, как сделать это более идиоматическим?
1 ответ
Вы также можете сделать это с вычитанием:
string
now_rfc3339()
{
const auto now_ms = time_point_cast<milliseconds>(system_clock::now());
const auto now_s = time_point_cast<seconds>(now_ms);
const auto millis = now_ms - now_s;
const auto c_now = system_clock::to_time_t(now_s);
stringstream ss;
ss << put_time(gmtime(&c_now), "%FT%T")
<< '.' << setfill('0') << setw(3) << millis.count() << 'Z';
return ss.str();
}
Это позволяет избежать "магического числа" 1000.
string
now_rfc3339()
{
return date::format("%FT%TZ", time_point_cast<milliseconds>(system_clock::now()));
}
Это делает то же самое, но с более простым синтаксисом.