12

如果我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但无法从示例中弄清楚。

4

3 回答 3

17

这就是我想要的:

  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;
于 2010-04-12T20:39:28.703 回答
4

虽然这没有使用 boost::date_time,但使用 boost::locale 相对容易,它更适合这项任务。因为您的需要只是从当前语言环境中获取格式化的时间。

恕我直言,当您处理甘特图/计划计算等软件时,应该使用 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。:)

于 2013-04-26T13:48:13.520 回答
0

我还没有找到其他足够方便的答案,所以这里有一个示例,展示了如何在完全控制单位的情况下获取本地时间或通用时间:

#include <boost/date_time/local_time/local_time.hpp>
#include <boost/format.hpp>

#include <iostream>

int main()
{
    auto const now = boost::posix_time::microsec_clock::local_time(); // or universal_time() for GMT+0
    if (now.is_special()) {
        // some error happened
        return 1;
    }

    // example timestamp (eg for logging)
    auto const t = now.time_of_day();
    boost::format formater("[%02d:%02d:%02d.%06d]");
    formater % t.hours() % t.minutes() % t.seconds() % (t.total_microseconds() % 1000000);
    std::cout << formater.str();
}

注意:该time_of_day结构没有.microseconds()or.nanoseconds()功能,只有.fractional_seconds()它返回一个整数,该整数是配置相关单元的倍数。.num_fractional_digits()可用于获取精度信息,其中10^frac_digitsfractional_seconds等于 1 秒的数字。

要获得与配置无关的亚秒单位,可以使用total_ milli/micro/nano _seconds()函数执行模运算作为一种解决方法。

于 2020-03-04T11:03:06.467 回答