Когда я пытаюсь преобразовать boost time_duration в строку с помощью sstream и фасета, я не получаю желаемый формат

Я пытаюсь преобразовать объект boost::posix_time::time_duration в нить формы "% H% M. Проблема в том, что диалог не работает, как будто его не существует.

  • Функция, которую я использую для преобразования Duration в строку, - convert_duration_to_string.

Я пробовал и этот способ, как показано в приведенной ниже функции. Это может решить проблему. Но это так некрасиво. Предположим, в будущем нам придется изменить формат даты. В этом случае нам также придется изменить код внутри функции.

std::string convert_duration_to_string(Duration duration) {
  std::ostringstream os;
  os << std::setfill('0') << std::setw(2) << duration.hours()
     << std::setfill('0') << std::setw(2) << duration.minutes();
  return os.str();
}

#include <boost/date_time/local_time/local_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include "boost/date_time/gregorian/gregorian.hpp"

#include <iostream>
#include <sstream>

typedef boost::posix_time::time_duration Duration;

boost::posix_time::ptime parse_time_object(const std::string &time,
                                           const std::string &format) {
  std::stringstream ss;
  ss << time.c_str();
  ss.imbue(std::locale(
      std::locale::classic(),
      new boost::local_time::local_time_input_facet(format.c_str())));
  boost::posix_time::ptime time_object;
  ss >> time_object;

  return time_object;
}


std::string convert_duration_to_string(Duration           duration,
                                       const std::string &format) {
  std::ostringstream os;
  os.imbue(std::locale(std::locale::classic(),
                       new boost::posix_time::time_facet(format.c_str())));
  os << duration;
  return os.str();
}


int main (){
    Duration duration = parse_time_object("0740", "%H%M").time_of_day();
    //[...] PLENTY OF THINGS CAN HAPPEN IN HERE THE DATE CAN GO through A 
    // WHOLE PIPELINE AND COME BACK
    std::cout << convert_duration_to_string(duration,"%H%M") << std::endl; //Should Pring 0740. instead it is printing 07:40:00
    return 0;
}
1
0
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы выводите продолжительность времени, поэтому вам нужно изменить формат продолжительности времени. Просто создать временной аспект с форматом продолжительности времени по умолчанию недостаточно. IOW модифицирует ваш код вот так ...:

std::string convert_duration_to_string(Duration           duration,
                                       const std::string &format) {
    std::ostringstream os;
    auto f = new boost::posix_time::time_facet(format.c_str());
    f->time_duration_format(format.c_str());
    os.imbue(std::locale(std::locale::classic(), f));
    os << duration;
    return os.str();
}

... кажется Работа.

Другие вопросы по теме