C++ 使用boost将UTC时间转换为自定义时区

C++ 使用boost将UTC时间转换为自定义时区,c++,datetime,boost,timezone,C++,Datetime,Boost,Timezone,我正在尝试将UTC时间转换为自定义时区。我在这里和那里读了很多关于它的问题,但它们似乎都做了相反的事情,或者在你不能设置时区的地方使用时间调节器。到目前为止,我已经做到了: boost::local_time::time_zone_ptr time_zone(new boost::local_time::posix_time_zone("EST5EDT,M3.2.0,M11.1.0")); boost::posix_time::ptime const

我正在尝试将UTC时间转换为自定义时区。我在这里和那里读了很多关于它的问题,但它们似乎都做了相反的事情,或者在你不能设置时区的地方使用时间调节器。到目前为止,我已经做到了:

 boost::local_time::time_zone_ptr           time_zone(new boost::local_time::posix_time_zone("EST5EDT,M3.2.0,M11.1.0"));
 boost::posix_time::ptime const             now(boost::gregorian::date(2004,11,5), boost::posix_time::hours(10));
 boost::local_time::local_date_time  const  ny(now, time_zone );
 //
 ny.utc_time().time_of_day();     // Expected: 10:00 Actual: 10:00
 ny.local_time().time_of_day();   // Expected: 04:00  Actual: 16:00
我希望ny.local_time()显示为04:00,因为当UTC时间为10:00时,纽约是4:00


有人能建议正确的方法吗?

boost库似乎将“偏移量”解释为添加到UTC以获取本地时间的量;而标准POSIX约定正好相反。换成

"EST-5EDT,M3.2.0,M11.1.0"
    ^

这很奇怪,因为我是从这个网站上看到的,看起来他们都错了:@jules:仔细看,我认为是Boost搞错了。根据POSIX,偏移量应该是添加到本地时间以获得UTC的值;Boost的情况正好相反有趣,你确定吗?我现在使用的是使用提供的csv数据库生成的posix时区字符串。它看起来是这样的:
EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00
,它可以按预期工作。@jules:不是100%确定,因为我没有POSIX标准的副本。但“指定要添加到本地时间的时间值以获得协调世界时(UTC)”,与Boost的约定相反。您确实应该避免使用POSIX时区。请参见POSIX中底部的部分。您应该改为使用IANA/Olson时区,例如
“America/NewYork”
。Boost支持这些功能,但它们使用的是过时的,并且删除了所有的历史。如果你想做正确的事,可以考虑使用。