Самый простой способ получить текущее время в текущем часовом поясе, используя boost :: date_time? - PullRequest
12 голосов
/ 10 апреля 2010

Если я наберу date +%H-%M-%S в командной строке (Debian / Lenny), я получу удобное для пользователя (не UTC, не DST-меньше, время, которое нормальный человек имеет на своих наручных часах) время, напечатанное.

Какой самый простой способ получить то же самое с 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() на час раньше, чем время, которое я хочу увидеть. Я не уверен, так ли это, потому что он показывает время по Гринвичу или местное время без коррекции летнего времени (я в Великобритании).

Какой самый простой способ изменить вышеприведенное, чтобы получить местный часовой пояс с поправкой на летнее время? У меня есть идея, что она включает boost::date_time:: c_local_adjustor, но я не могу понять это из примеров.

Ответы [ 2 ]

17 голосов
/ 13 апреля 2010

Это делает то, что я хочу:

  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;
4 голосов
/ 26 апреля 2013

Хотя это не использует boost :: date_time, это относительно просто с boost :: locale, который более приспособлен для этой задачи. Поскольку вам нужно просто получить отформатированное время из текущей локали.

IMHO boost :: date_time следует использовать, когда вы имеете дело с такими программами, как вычисления Ганта и планирования, если у вас много арифметики 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. :)

...