码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-11 17:56:20      阅读:574      评论:0      收藏:0      [点我收藏+]

标签: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::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();

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

标签:boost   deadline_timer   定时器   

原文地址:http://blog.csdn.net/willib/article/details/44996113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!