Как получить локальную дату-время из time_t с boost :: date_time? - PullRequest
1 голос
/ 26 мая 2011

Я использую boost :: date_time, и я получил time_t, который был сгенерирован библиотекой с использованием функции time () из стандартной библиотеки C.

Я ищу способ получитьместное время с того времени.Я читаю документацию и не могу найти способ сделать это без предоставления часового пояса, о котором я не знаю, потому что он зависит от локали компьютера, и я не могу найти способ получить один из них.

Чего мне не хватает?

Ответы [ 3 ]

11 голосов
/ 26 мая 2011

повышение :: posix_time :: from_time_t ()

#include <ctime>
#include <ostream>
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
#include <boost/date_time/c_local_time_adjustor.hpp>

boost::posix_time::ptime local_ptime_from_utc_time_t(std::time_t const t)
{
    using boost::date_time::c_local_adjustor;
    using boost::posix_time::from_time_t;
    using boost::posix_time::ptime;
    return c_local_adjustor<ptime>::utc_to_local(from_time_t(t));
}

int main()
{
    using boost::posix_time::to_simple_string;
    using boost::posix_time::from_time_t;

    std::time_t t;
    std::time(&t); // initalize t as appropriate
    std::cout
        << "utc:   "
        << to_simple_string(from_time_t(t))
        << "\nlocal: "
        << to_simple_string(local_ptime_from_utc_time_t(t))
        << std::endl;
}
1 голос
/ 26 мая 2011

Для этой задачи я бы проигнорировал boost::date_time и просто использовал localtime (или localtime_r, если доступно) из стандартной библиотеки.

0 голосов
/ 26 мая 2011

Попробуйте это:

#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) {

  cout << second_clock::local_time() << endl;

}

, который на моем ящике (Центральное время) дает:

$ ./boost_local_time
2011-May-26 14:00:18

Если вы хотите отформатировать его (это был мой тестовый пример), используйте

time_facet *facet = new time_facet("%d-%b-%Y %H:%M:%S");  
cout.imbue(locale(cout.getloc(), facet));   

перед звонком second_clock::local_time().

...