Какой самый красивый способ преобразовать time_point в строку?

Простой вопрос: как правильно преобразовать std::chrono::time_point в std::string с минимальным количеством кода?

Примечания: я не хочу использовать cout с put_time(). Принимаются решения C++11 и C++14.


person draganrakita    schedule 11.01.2018    source источник
comment
Добро пожаловать в StackOverflow! Не могли бы вы предоставить код, представляющий минимальный, полный и проверяемый пример вашей задачи? См. stackoverflow.com/help/mcve.   -  person David C.    schedule 12.01.2018
comment
Привет, Давик С. рад быть здесь. У меня нет кода, который мне нужно отладить, или задачи, которые нужно закончить, я хочу найти подходящее и элегантное решение, которое я смогу использовать в будущем.   -  person draganrakita    schedule 12.01.2018


Ответы (2)


#include "date/date.h"
#include <type_traits>

int
main()
{
    auto s = date::format("%F %T", std::chrono::system_clock::now());
    static_assert(std::is_same<decltype(s), std::string>, "");
}

date/date.h находится здесь. Это библиотека только для заголовков, С++ 11/14/17. Он имеет письменную документацию и видео-введение.

Обновлять:

В С++ 20 синтаксис такой:

#include <chrono>
#include <format>
#include <type_traits>

int
main()
{
    auto s = std::format("{:%F %T}", std::chrono::system_clock::now());
    static_assert(std::is_same_v<decltype(s), std::string>{});
}
person Howard Hinnant    schedule 12.01.2018
comment
Привет @Howard, спасибо за создание библиотеки дат, она кажется отличным кодом, и я обязательно углублюсь в нее (и, вероятно, использую ее), но для этого вопроса я хочу найти решение, которое использует стандартные библиотеки. - person draganrakita; 12.01.2018
comment
Я понял, и удачи в ваших поисках. Одна из таких стратегий — отправиться в отпуск на несколько лет, и, возможно, когда вы вернетесь, это будет войдет в стандартную библиотеку. ;-) Предложение - person Howard Hinnant; 12.01.2018
comment
Я надеюсь, что это так, нам нужно что-то вроде этого. :) - person draganrakita; 13.01.2018

Использование только заголовков стандартной библиотеки:

    #include <ctime>
    #include <chrono>
    #include <string>

    using sc = std::chrono::system_clock ;
    std::time_t t = sc::to_time_t(sc::now());
    char buf[20];
    strftime(buf, 20, "%d.%m.%Y %H:%M:%S", localtime(&t));
    std::string s(buf);
person StPiere    schedule 12.01.2018
comment
Это так похоже на синтаксис C, что я просто приму ответ Говарда. - person draganrakita; 17.01.2018