如何在boost c++中获取linux服务器的当前时间并将其转换为给定的时区(例如MST-7)?我希望白天的节能时间能自动计算出来。
如果我运行以下代码,则不考虑dst:
boost::posix_time::ptime currentTime = boost::posix_time::second_clock::local_time();
date today = day_clock::local_day();
time_zone_ptr phx_tz(new posix_time_zone("MST-07:00:00"));
local_date_time phx_departure(currentTime, phx_tz);
这个问题的真正答案是:不要。
我将引用我从夏令时和时区最佳实践中得到的答案:
- 如果使用C++,请确保使用正确实现IANA时区数据库的库。其中包括中央电视台、重症监护室和霍华德·欣南特的"tz"图书馆。
- 不要将Boost用于时区转换。虽然其API声称支持标准IANA(又称"zoneinfo")标识符,但它将它们粗略地映射到固定偏移,而不考虑每个区域可能发生的丰富变化历史。(此外,该文件已脱离维护。)
考虑一下Boost时区文件的最后一次提交日期是2011年6月24日,因此即使设计糟糕的API和他们的实现,它甚至没有实现自己的承诺,因为它不知道过去5年的时区变化!
此外,您真的不应该使用POSIX时区。他们有许多不足之处,应予以劝阻。请参阅时区标签wiki中关于POSIX时区的部分。相反,您应该使用正确的IANA/Olson时区标识符,对于美国山地时区(使用夏令时),该标识符为America/Denver
,对于亚利桑那州不使用夏令时的部分,该标识符应为America/Phoenix
。
您可以在时区定义中指定DST信息:
time_zone_ptr phx_tz(new posix_time_zone("MST-07MDT01:00:00,M3.2.0/02:00:00,M11.1.0/02:00:00"));