Повышение формата вывода даты и времени игнорируется

У меня возникли проблемы при попытке выяснить, как заставить Boost отформатировать объект даты / времени в виде строки. Я пытаюсь установить спецификатор формата, но он игнорируется и продолжает выводить дату в предопределенном стиле.

Вероятно, это проще объяснить с помощью демонстрации, поэтому вот пример кода, показывающего проблему:

#include <boost/date_time.hpp>
#include <iostream>

int main(void)
{
    int i = 1485324852;
    boost::posix_time::ptime pt = boost::posix_time::from_time_t(i);

    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();
    output_facet->format("%d/%m/%Y %H:%M");

    std::stringstream ss;
    ss.imbue(std::locale(std::locale::classic(), output_facet));
    ss << pt;

    std::string strTime = ss.str();
    std::cout << "Time " << i << " converted to UI string: " << strTime << "\n";

    return 0;
}

Это дает мне такой вывод:

Time 1485324852 converted to UI string: 2017-Jan-25 06:14:12

То, что я ожидал, это:

Time 1485324852 converted to UI string: 25/01/2017 16:14

Я сказал output_facet использовать %d/%m/%Y %H:%M спецификатор формата в соответствии с примером, приведенным в документации Boost, но это игнорируется.

Я не вижу, где я ошибаюсь при настройке формата. Это, наверное, что-то очевидное, поэтому кто-нибудь может мне это указать?

2 ответа

Решение

Я думаю, что вы смешиваете local_date а также posix_time,

Добавление в конце вашего кода решает вашу проблему и печатает нужный формат:

boost::local_time::local_date_time ldt(boost::local_time::not_a_date_time);
ss >> ldt;
ss.str("");
ss << ldt;
std::cout << ss.str() << std::endl;

Тем не менее, если вы хотите распечатать нужный формат, используя posix_time вам нужно изменить:

boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();

чтобы:

 boost::posix_time::time_facet *output_facet = new boost::posix_time::time_facet();

Хорошо, я воспроизвел это, я не могу получить правильный вывод с вашим кодом. Вот фрагмент, может дать правильный вывод. Единственное отличие, которое я вижу, это local_time_facet против time_facet,

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>

using namespace boost::posix_time;
using namespace std;

int main(int argc, char **argv) {
  boost::posix_time::ptime now = boost::posix_time::from_time_t(123456789);
  time_facet *facet = new time_facet("%d/%b/%Y %H:%M:%S");
  cout.imbue(locale(cout.getloc(), facet));
  cout <<  now << endl;
}
Другие вопросы по тегам