Метка времени C ++ RFC3339 с миллисекундами с использованием std :: chrono - PullRequest
0 голосов
/ 23 января 2019

Я создаю 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 Ответ

0 голосов
/ 23 января 2019

Вы также можете сделать это с вычитанием:

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()));
}

Это делает то же самое, но с более простым синтаксисом.

...