Проблема, с которой вы столкнулись, вызвана таймером по умолчанию в asio, который использует часы boost.date_time, которые являются таймером настенных часов. Он представляет фактическое время, как показывают ваши настенные часы.
Если вы посмотрите на значение по умолчанию time_traits
, используемое asio deadline_timer (boost/asio/time_traits.hpp
), вы увидите, что его реализация now()
использует boost::posix_time::microsec_clock::universal_time()
. Это означает, что Asio понимает, сколько времени, UTC. Когда вы переходите в абсолютное время к expires_at()
, asio сравнивает его с пониманием того, который час, то есть UTC.
Я полагаю, что использование local_time()
сработало только по стечению обстоятельств, потому что оно совпадало с UTC.
Хотя, как уже указывалось, использование часов без летнего времени значительно улучшает ситуацию, фундаментальная проблема все еще существует.
UTC все еще не монотонные часы. У него будут високосные годы и високосные секунды, но в первую очередь пользователь (или, скорее всего, ntpd) может изменить часы компьютера, и ваши таймеры начнут выходить из строя.
Это гораздо более тонкий вопрос, который можно решить, определив свою собственную специализацию asio::time_traits
, используя монотонные часы. Например, clock_gettime(CLOCK_MONOTONIC)
.