boost :: posix_time:使用夏令时检索时间

时间:2016-12-27 22:57:36

标签: c++ boost dst boost-date-time

我使用以下方法使用boost::posix_time检索包含当前时间的字符串:

wstring TimeField::getActualTime() const {
  // Defined elsewhere
  auto m_facet = new new boost::posix_time::wtime_facet(L"%Y%m%d-%H:%M:%f");
  std::locale m_locale(std::wcout.getloc(), m_facet);
  // method body
  std::basic_stringstream<wchar_t> wss;
  wss.imbue(m_locale);
  boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
  wss << now;
  return wss.str();
}

我获得以下结果:

  

20161227-22:52:238902

虽然在我的电脑时间 23:52 。在我的电脑(Windows 10)中,选项自动调整夏令时

是否有办法检索PC时间(并根据方面格式化),同时考虑夏令时选项?

1 个答案:

答案 0 :(得分:2)

我同意。 DST无效。此外,posix_time::ptime的定义不是时区感知时间戳(因此:POSIX时间)。

但是,您可以选择当地时间,而不是普及时间:

boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();

文档会警告您不要信任系统提供的默认时区信息和数据库,但您可能会没事。

<强> Live On Coliru

#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <string>
#include <iostream>

namespace /*static*/ {
    // Defined elsewhere
    auto m_facet = new boost::posix_time::wtime_facet(L"%Y%m%d-%H:%M:%f");
    std::locale m_locale(std::wcout.getloc(), m_facet);
}

std::wstring getActualTime() {
    std::basic_stringstream<wchar_t> wss;
    wss.imbue(m_locale);

    wss << boost::posix_timemicrosec_clock::local_time();
    return wss.str();
}

int main() {
    std::wcout << getActualTime();
}