Подтвердить что ты не робот

Как преобразовать boost:: ptime в строку

У меня возникли проблемы с преобразованием объекта ptime из boost в строку, которая будет передана функции. Я нашел несколько аналогичных других потоков в отношении вывода объекта времени ускорения в строку (в основном для cout), но ни одно из того, что я нашел на них, не работает.

Похоже, что самый простой способ - вставить объект ptime в строковый поток, а затем использовать строку stringstream. Я также попытался проникнуть в stringstream с помощью time_facet, как показывают некоторые ответы на другие темы. Однако я не могу создать объект time_facet. Это дает мне ошибку, что список аргументов для шаблона класса отсутствует. То, что запутывает, - это нигде в Интернете, я не нашел упоминания о списке аргументов для time_facet, и даже повысить страницу документации показывает, что конструктор по умолчанию для time_facet является просто time_facet().

Ниже приведена простая версия того, что я пробовал:

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

boost::posix_time::ptime time = boost::posix_time::time_from_string("1981-08-20 08:05:00"); 
std::stringstream sstream;
sstream << time;
_updateStatement->setString(1, (sql::SQLString)sstream.str());

Вставка времени в строковый поток дает мне кучу ошибок компиляции в вене

error C2220: warning treated as error - no 'object' file generated C:\code\trunk\Development\External\boost\include\boost/date_time/time_facet.hpp(247) :while compiling class template member function 'boost::date_time::time_facet<time_type,CharT>::time_facet(size_t)'
          with
          [
              time_type=boost::posix_time::ptime,
              CharT=char
          ]

несмотря на то, что я не использовал никаких объектов time_facet.

Когда я пытаюсь сделать это с помощью объекта time_facet, я добавляю

sstream.imbue(std::locale(sstream.getloc(), new boost::date_time::time_facet("%Y-%m-%d %H:%M:%S")));

прежде чем вставлять время в строковый поток. Ошибки для этого - то, что он хочет список аргументов, упомянутый в начале этого сообщения.

Возможно, есть функция в boost, которая является обратной версией boost:: posix_time:: time_from_string()? Если нет, любая другая помощь будет оценена по достоинству. Спасибо.

4b9b3361

Ответ 1

Библиотека Boost.Date_Time предоставляет следующие ptime to std::string преобразования в пространстве имен boost::posix_time:

  • std::string to_simple_string(ptime) возвращает строку в формате YYYY-mmm-DD HH:MM:SS.fffffffff, где mmm - это трехзначное имя месяца.
  • std::string to_iso_string(ptime) возвращает строку в форме YYYYMMDDTHHMMSS,fffffffff, где T является разделителем даты и времени.
  • std::string to_iso_extended_string(ptime) возвращает строку в форме YYYY-MM-DDTHH:MM:SS,fffffffff, где T является разделителем даты и времени.

Кроме того, предоставляются вставка и извлечение потока operators, позволяющие ptime вставляться или извлекаться из потока. Форматы ввода и вывода можно настроить, построив грани с различными флагами , а затем введя поток с гранью.

Исходя из ошибки компиляции (C2220), компилятор настроен на обработку всех предупреждений как ошибок. В некоторых случаях библиотеки Boost собираются с предупреждениями. Рассмотрите возможность оценки серьезности фактического предупреждения и надлежащего обращения с ним. Например, если предупреждение тривиально, может быть приемлемо использовать предупреждающую прагму, чтобы отключить или подавить конкретное предупреждение.


Вот пример , демонстрирующий преобразование ptime в строку с помощью предоставляемых им функций преобразования и операторов потока.

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

int main()
{
  const boost::posix_time::ptime time = 
      boost::posix_time::time_from_string("1981-08-20 08:05:00");

  // ptime to string.
  const std::string str_time = to_simple_string(time);
  std::cout << str_time << std::endl;

  // ptime to stringstream to string.
  std::stringstream stream;
  stream << time;
  std::cout << stream.str() << std::endl;
  stream.str("");

  // Use a facet to display time in a custom format (only hour and minutes).
  boost::posix_time::time_facet* facet = new boost::posix_time::time_facet();
  facet->format("%H:%M");
  stream.imbue(std::locale(std::locale::classic(), facet));
  stream << time;
  std::cout << stream.str() << std::endl;
}

Что производит следующий вывод:

1981-Aug-20 08:05:00    
1981-Aug-20 08:05:00    
08:05

Ответ 2

Мое использование с использованием версии 1.55

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

int main()
{
  boost::gregorian::date dayte(boost::gregorian::day_clock::local_day());
  boost::posix_time::ptime midnight(dayte);
  boost::posix_time::ptime 
     now(boost::posix_time::microsec_clock::local_time());
  boost::posix_time::time_duration td = now - midnight;

  std::stringstream sstream;

  std::cout << dayte << std::endl;
  std::cout << dayte.year() << "/" << dayte.month().as_number()
   << "/" << dayte.day() << std::endl;
  std::cout << now << std::endl;
  std::cout << td << std::endl;
  std::cout << td.hours() << "/" << td.minutes() << "/"
     << td.seconds() << "/" << td.fractional_seconds() << std::endl;

  sstream << dayte << std::endl;
  sstream << dayte.year() << "/" << dayte.month().as_number()
     << "/" << dayte.day() << std::endl;
  sstream << now << std::endl;
  sstream << td << std::endl;
  sstream << td.hours() << "/" << td.minutes() << "/" << td.seconds()
    << "/" << td.fractional_seconds() << std::endl;

  std::cout << sstream.str();
}

Результаты:

2015-Oct-27
2015/10/27
2015-Oct-27 14:25:18.614684
14:25:18.614684
14/25/18/614684
2015-Oct-27
2015/10/27
2015-Oct-27 14:25:18.614684
14:25:18.614684