The following code covers the more general case when a script needs to be paused for any fixed window lasting less than 24 hours. Example: must sleep from 11:00 to 01:00.
import datetime as dt def sleep_duration(sleep_from, sleep_to, now=None): # sleep_* are datetime.time objects # now is a datetime.datetime object if now is None: now = dt.datetime.now() duration = 0 lo = dt.datetime.combine(now, sleep_from) hi = dt.datetime.combine(now, sleep_to) if lo <= now < hi: duration = (hi - now).seconds elif hi < lo: if now >= lo: duration = (hi + dt.timedelta(hours=24) - now).seconds elif now < hi: duration = (hi - now).seconds return duration tests = [ (4, 5, 3, 30), (4, 5, 4, 0), (4, 5, 4, 30), (4, 5, 5, 0), (4, 5, 5, 30), (23, 1, 0, 0), (23, 1, 0, 30), (23, 1, 0, 59), (23, 1, 1, 0), (23, 1, 1, 30), (23, 1, 22, 30), (23, 1, 22, 59), (23, 1, 23, 0), (23, 1, 23, 1), (23, 1, 23, 59), ] for hfrom, hto, hnow, mnow in tests: sfrom = dt.time(hfrom) sto = dt.time(hto) dnow = dt.datetime(2010, 7, 5, hnow, mnow) print sfrom, sto, dnow, sleep_duration(sfrom, sto, dnow)
and here is the conclusion:
04:00:00 05:00:00 2010-07-05 03:30:00 0 04:00:00 05:00:00 2010-07-05 04:00:00 3600 04:00:00 05:00:00 2010-07-05 04:30:00 1800 04:00:00 05:00:00 2010-07-05 05:00:00 0 04:00:00 05:00:00 2010-07-05 05:30:00 0 23:00:00 01:00:00 2010-07-05 00:00:00 3600 23:00:00 01:00:00 2010-07-05 00:30:00 1800 23:00:00 01:00:00 2010-07-05 00:59:00 60 23:00:00 01:00:00 2010-07-05 01:00:00 0 23:00:00 01:00:00 2010-07-05 01:30:00 0 23:00:00 01:00:00 2010-07-05 22:30:00 0 23:00:00 01:00:00 2010-07-05 22:59:00 0 23:00:00 01:00:00 2010-07-05 23:00:00 7200 23:00:00 01:00:00 2010-07-05 23:01:00 7140 23:00:00 01:00:00 2010-07-05 23:59:00 3660