将本地日期时间CET转换为UTC

3

我尝试将boost库中的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)慢一小时。

这是一个 bug 吗,还是我漏掉了什么?


1
你需要再多做一些。这里有一个Boost的例子,我过去曾经使用过。(http://www.boost.org/doc/libs/1_57_0/doc/html/date_time/examples.html#date_time.examples.local_utc_conversion) - Dirk Eddelbuettel
1个回答

5
boost::local_time::posix_time_zone("CET") 构造函数调用创建了一个带有 CET 缩写的时区,并缺少有关与 UTC 的偏移量、夏令时时间偏移等信息,即调用 boost::local_time::posix_time_zone("CET")boost::local_time::posix_time_zone("UTC") 仅在 TZ 缩写名称上不同,其余相同。这个 coliru 代码演示了它。这两个 TZ 的 base_utc_offset 方法调用都返回 00:00:00
要解决问题,需要设置 CET 时区的时间参数,例如 "CET+01:00:00",或使用 tz_database 类从 CSV 文件加载时区。
下面的代码是修改后的原始代码,演示如何解决问题。请注意,CET 时区描述不完整,仅作为示例提供。
#include "boost/date_time/local_time/local_time.hpp"
#include <iostream>

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+01:00:00"));
    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;
}

同样的代码在 coliru 上可以通过 此链接 获取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接