Решение Jeremy действительно элегантно, но оно не учитывает переход на летнее время.
Чтобы защититься от этого, вы должны запускать событие таймера каждый час и проверять настенные часы.
Вычислите дельту цели, как предлагает Джереми, и, если она падает в течение ближайшего часа, установите таймер на срабатывание и отключите почасовой таймер.
Если нет, просто подождите, пока почасовой таймер снова сработает.
Pseudo code:
Get wall clock time
Calculate difference between target time and wall clock
If difference < 1 hour:
Set timer to fire after difference secs
If this is a repeating event, restart the hourly timer
Else:
Start watch timer to do this calculation again after one hour