Boost.deadline_timer实现定时器功能时需注意的时区问题

利用boost.deadline_timer() 可以很方便的实现定时器功能,详情参考:http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/deadline_timer.html
比如等待指定的时间数:

boost::asio::io_service ioservice; boost::asio::deadline_timer tm(ioservice, boost::posix_time::seconds(5)); //这里指定的是绝对时间,若指定相对时间可用time_duration指定时间段 time.wait();

这里也可以用deadline_timer的两个成员函数来指定需等待的时间,deadline_timer.expires_at(指定绝对时间),deadline_timer.expires_from_now(指定相对时间),在等待的时候可选择同步或者异步,time.wait()或者time.async_wait(handler),操作起来比较方便,而且还是跨平台的。

但是在这里有一个问题,比如我在做一个定时升级的工具时,我想指定升级工具的升级时间,比如是2015.4.12 00:00,按照官网上的做法是,(这里指定的是绝对时间)
boost::asio::io_service ioservice; //两种不同的时间格式 boost::asio::deadline_timer tm(ioservice, boost::posix_time::time_from_string("2015-04-12 23:01:50"); //boost::asio::deadline_timer tm(ioservice, boost::posix_time::from_iso_string("20150412T230150")); //以T为分隔符 time.wait();

这么做了后,你会发现程序根本没有等待到你指定的时间才开始相应的任务,而是提前很长一段时间,当时弄了很久尝试了很多方法还是百思不得其解,后来仔细的看了下文档后才发现原来boost中的时间是UTC时间,在程序中应该换成本地时间,所以得换算下时区才行或者用boost中提供的local_time,
【Boost.deadline_timer实现定时器功能时需注意的时区问题】

boost::asio::io_service ioservice; boost::posix_time::ptime tm(boost::posix_time::time_from_string("2015-04-12 23:01:50")); tm -= boost::posix_time::time_duration(8, 0, 0); //北京时间转换为UTC时间, 相差8个小时 boost::asio::deadline_timer timer(ioservice, tm); timer.wait();




    推荐阅读