2017-01-25 5 views
0

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

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

#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 формата в соответствии с example given in the Boost docs, но это игнорируется.

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

+0

см http://stackoverflow.com/questions/1904317/how-to-format-date-tim e-object-with-format-dd-mm-yyyy – Asalle

ответ

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

Хорошо, я воспроизвел его, я не могу получить правильный вывод с вашим кодом. Вот фрагмент, может дать правильный выход. Единственное различие, которое я вижу, - 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; 
} 
+0

Я не уверен, что вы имеете в виду - я не использую 'local_time'. Если вы внесете предлагаемое изменение в код выше, будет ли он компилироваться для вас и создать ожидаемый формат 'dd/mm/yyyy'? – Malvineous

+0

никогда, я был неправ :) – Asalle

 Смежные вопросы

  • Нет связанных вопросов^_^