Каков наилучший подход для получения строки метки времени с округленными миллисекундами в библиотеке дат Говарда Хиннанта? - PullRequest
4 голосов
/ 26 марта 2020

У меня есть следующий код, использующий библиотеку дат:

#include "date.h"
#include <iostream>
#include <sstream>

using namespace date;
using namespace std::chrono;

int main()
{
    auto now = system_clock::now();
    std::stringstream ss;
    ss << now;
    std::string nowStr = ss.str();   // I need a string
    std::cout << nowStr << " UTC\n";
}

Результат:

2020-03-26 17:38:24.473372486 UTC

Является ли stringstream правильным подходом для получения строки из chrono :: timepoint что сейчас () возвращает? И, если да, как я могу округлить эти наносекунды до миллисекунд?

1 Ответ

4 голосов
/ 26 марта 2020

Да, ostringstream - хороший способ сделать это. Вы также можете использовать date::format, который возвращает string, но при этом все равно используется ostringstream для внутреннего использования:

string s = format("%F %T %Z", now);

. С помощью любого из методов вы можете усечь до milliseconds вывод, усечив вход * От 1009 * до milliseconds до форматирования. Вы можете выбрать любой из этих режимов округления:

  • округление до даты эпохи: time_point_cast<milliseconds>(now)
  • округление в прошлое: floor<milliseconds>(now)
  • округление до будущее: ceil<milliseconds>(now)
  • раунд в сторону ближайшего (в направлении даже на t ie): round<milliseconds>(now)

-

string s = format("%F %T %Z", floor<milliseconds>(now));

2020-03-26 17:38:24.473 UTC

In C + +20 это станет:

string s = format("{:%F %T %Z}", floor<milliseconds>(now));
...