Самый простой способ получить текущее время в текущем часовом поясе с помощью boost:: date_time?
Если я делаю date +%H-%M-%S
в командной строке (Debian/Lenny), я получаю удобное для пользователя время (не UTC, а не DST-less, время, которое нормальный человек имеет на наручных часах).
Какой самый простой способ получить то же самое с boost::date_time
?
Если я это сделаю:
std::ostringstream msg;
boost::local_time::local_date_time t =
boost::local_time::local_sec_clock::local_time(
boost::local_time::time_zone_ptr()
);
boost::local_time::local_time_facet* lf(
new boost::local_time::local_time_facet("%H-%M-%S")
);
msg.imbue(std::locale(msg.getloc(),lf));
msg << t;
Тогда msg.str()
на час раньше, чем время, которое я хочу видеть. Я не уверен, что это потому, что он показывает UTC или местное время часового пояса без коррекции DST (я в Великобритании).
Каков самый простой способ изменить приведенное выше, чтобы учесть время локального часового пояса, измененное DST? У меня есть идея, что он включает boost::date_time:: c_local_adjustor
, но не может понять это из примеров.
Ответы
Ответ 1
Это делает то, что я хочу:
namespace pt = boost::posix_time;
std::ostringstream msg;
const pt::ptime now = pt::second_clock::local_time();
pt::time_facet*const f = new pt::time_facet("%H-%M-%S");
msg.imbue(std::locale(msg.getloc(),f));
msg << now;
Ответ 2
Хотя это не использует boost:: date_time, это относительно легко с boost:: locale, который более приспособлен для этой задачи. Поскольку вам нужно просто получить отформатированное время из текущей локали.
IMHO boost:: date_time следует использовать, когда вы имеете дело с программными средствами, такими как вычисления gantt/planning, если у вас есть арифметика date_time. Но просто для использования времени и выполнения некоторой арифметики на нем вы ускорите успех с boost:: locale.
#include <iostream>
#include <boost/locale.hpp>
using namespace boost;
int main(int argc, char **argv) {
locale::generator gen;
std::locale::global(gen(""));
locale::date_time now;
std::cout.imbue(std::locale());
std::cout << locale::as::ftime("%H-%M-%S") << now << std::endl;
return 0;
}
Сейчас он должен выводить: 15-45-48.:)