Преобразовать boost :: posix_time :: ptime в строку, используя пользовательский часовой пояс - PullRequest
4 голосов
/ 18 августа 2011

У меня есть экземпляр boost::posix_time::ptime, и я хотел бы преобразовать ("отформатировать") его в строку, используя данный экземпляр boost::local_time::time_zone_ptr.Ниже приведена тестовая программа, показывающая, что у меня сейчас есть.Он преобразует ptime в local_date_time, который, по моему пониманию, выражает часовой пояс в дополнение к информации о времени.

При запуске этой программы в 2011-08-18 12:00:00 UTCОжидаю выхода 2011-08-18 14.00.00 UTC+02:00.Вместо этого он печатает 2011-08-18 12:00:00 UTC+00:00.т.е. относительно напечатанного часового пояса, напечатанное время является правильным, но оно не находится в часовом поясе, который я использовал для создания экземпляра boost::local_time::local_date_time.

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

#include <iostream>
#include <ctime>

#include <boost/date_time.hpp>

int main(int argc, char ** argv) {
    using namespace std;

    // Get current time, as an example
    boost::posix_time::ptime dt = boost::posix_time::microsec_clock::universal_time();

    // Create a time_zone_ptr for the desired time zone and use it to create a local_date_time
    boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("EST"));
    boost::local_time::local_date_time dt_with_zone(dt, zone);

    std::stringstream strm;

    // Set the formatting facet on the stringstream and print the local_date_time to it.
    // Ownership of the boost::local_time::local_time_facet object goes to the created std::locale object.
    strm.imbue(std::locale(std::cout.getloc(), new boost::local_time::local_time_facet("%Y-%m-%d %H:%M:%S UTC%Q")));
    strm << dt_with_zone;

    // Print the stream's content to the console
    cout << strm.str() << endl;

    return 0;
}

Как преобразовать экземпляр local_date_time в строку, чтобы дата в строке представлялась с использованием часового пояса, указанного экземпляром time_zone_ptr?

1 Ответ

3 голосов
/ 22 августа 2011

Я думаю, что boost не знает спецификатор часового пояса.Замените

new boost::local_time::posix_time_zone("EST")

в вашем коде на

new boost::local_time::posix_time_zone("EST-05:00:00")

, и все работает нормально.Если вы хотите использовать общие стандартные имена, вам нужно создать базу данных часовых поясов, как описано в документации повышения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...