Как преобразовать 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()? Если нет, любая другая помощь будет оценена по достоинству. Спасибо.
Ответы
Ответ 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