将local_date_time CET提升为UTC

时间:2015-03-02 22:43:58

标签: c++ boost timezone

我尝试将提升local_date_time转换为UTC,但我对utc_time()的返回时间感到困惑。这是一个简化的代码:

#include "boost/date_time/local_time/local_time.hpp"

int main()
{
  using namespace boost::gregorian;
  using namespace boost::local_time;
  using namespace boost::posix_time;

  ptime dt = ptime(date(2015, Mar, 2), hours(0));
  time_zone_ptr tz_cet(new boost::local_time::posix_time_zone("CET"));
  local_date_time local_dt = boost::local_time::local_date_time(dt, tz_cet);

  std::cout << local_dt << std::endl;
  std::cout << local_dt.utc_time() << std::endl;

  time_zone_ptr tz_utc(new boost::local_time::posix_time_zone("UTC"));
  std::cout << local_dt.local_time_in(tz_utc) << std::endl;
}

输出:

2015-Mar-02 00:00:00 CET
2015-Mar-02 00:00:00
2015-Mar-02 00:00:00 UTC

UTC应该比CET(中欧时间)晚1小时。

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:5)

boost::local_time::posix_time_zone("CET")构造函数调用创建一个区域,其中包含CET缩写,缺少有关UTC的偏移量,DST的时移等信息,即调用boost::local_time::posix_time_zone("CET")和{{1}仅在TZ缩写名称中有所不同,其余的是相同的。 coliru code证明了这一点。两个TZ的boost::local_time::posix_time_zone("UTC")方法调用都会返回base_utc_offset

要解决此问题,必须设置00:00:00区域的时间参数,例如,&#34; CET + 01:00:00&#34;或使用tz_database类从CSV文件加载时区。

以下代码是原始修改过的代码,演示了如何解决问题。请注意,CET时区描述并不完整,仅作为示例提供。

CET

this链接提供了coliru上的相同代码。

相关问题