将 local_date_time CET 提升为 UTC
boost local_date_time CET to UTC
我尝试将提升 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 小时。
这是一个错误还是我遗漏了什么?
boost::local_time::posix_time_zone("CET")
构造函数调用创建了一个带有 CET
缩写的区域,并且缺少有关 UTC 偏移量、DST 时移等信息,即调用 boost::local_time::posix_time_zone("CET")
和 boost::local_time::posix_time_zone("UTC")
仅TZ缩写名称不同,其余相同。 coliru code 演示了它。 base_utc_offset
两个 TZ 的方法调用 return 00:00:00
.
要解决此问题,必须设置 CET
区域的时间参数,例如 "CET+01:00:00" 或使用 tz_database class 加载来自 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 上的相同代码可由 this link 获得。
我尝试将提升 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 小时。
这是一个错误还是我遗漏了什么?
boost::local_time::posix_time_zone("CET")
构造函数调用创建了一个带有 CET
缩写的区域,并且缺少有关 UTC 偏移量、DST 时移等信息,即调用 boost::local_time::posix_time_zone("CET")
和 boost::local_time::posix_time_zone("UTC")
仅TZ缩写名称不同,其余相同。 coliru code 演示了它。 base_utc_offset
两个 TZ 的方法调用 return 00:00:00
.
要解决此问题,必须设置 CET
区域的时间参数,例如 "CET+01:00:00" 或使用 tz_database class 加载来自 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 上的相同代码可由 this link 获得。