def get_next_fire_time(conf, last_fire_ts): n, unit = conf['every'] interval = n * SECOND[unit] next_ts = last_fire_ts + interval at = conf.get('at') if at is None: return get_time_info(next_ts) timezone_name = conf.get('timezone') if timezone_name is None: tz = tzlocal.get_localzone() else: tz = pytz.timezone(timezone_name) next_dt = datetime.datetime.fromtimestamp(next_ts, tz) actual_next_dt = next_dt.replace(**at) actual_next_ts = timeutil.datetime_to_ts(actual_next_dt) next_fire_time = get_time_info(actual_next_ts) if actual_next_ts <= last_fire_ts: msg = ('next fire time: %s, is before last fire ts: %f, conf: %s' % (repr(next_fire_time), last_fire_ts, repr(conf))) raise NextFireTimeError(msg) return next_fire_time
def test_datetime_to_ts(self): ts = time.time() dt = datetime.datetime.fromtimestamp(ts) r = timeutil.datetime_to_ts(dt) self.assertEqual(ts, r) test_timezones = ( 'US/Pacific', 'Europe/Warsaw', 'Asia/Shanghai', ) for timezone_name in test_timezones: dt = datetime.datetime.fromtimestamp( ts, tz=pytz.timezone(timezone_name)) r = timeutil.datetime_to_ts(dt) self.assertEqual(ts, r)
def test_parse_with_timezone(self): cases = ( ('2018-04-03 17:45:01', 'Asia/Shanghai', 1522748701), ('2018-04-03 17:45:01', 'UTC', 1522748701 + 3600 * 8), ) for time_str, timezone, exp_ts in cases: dt = timeutil.parse(time_str, 'mysql', timezone=timezone) ts = timeutil.datetime_to_ts(dt) self.assertEqual(exp_ts, ts)