From 23fe991b85bb2637bf3b82e2298104e8f6b3ffee Mon Sep 17 00:00:00 2001 From: Ambro Date: Fri, 4 Jan 2019 16:29:07 -0300 Subject: [PATCH] Fix bug: unable to save jobs with timezone aware dates (#1308) * Fix bug on jobs with timezone aware dates * Add Ambro17 as colaborator --- AUTHORS.rst | 1 + telegram/ext/jobqueue.py | 2 +- tests/test_jobqueue.py | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index be534f777..cecf99f84 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -16,6 +16,7 @@ Contributors The following wonderful people contributed directly or indirectly to this project: - `Alateas `_ +- `Ambro17 `_ - `Anton Tagunov `_ - `Avanatiker `_ - `Balduro `_ diff --git a/telegram/ext/jobqueue.py b/telegram/ext/jobqueue.py index e6eb36012..ec9dc12b8 100644 --- a/telegram/ext/jobqueue.py +++ b/telegram/ext/jobqueue.py @@ -62,7 +62,7 @@ class JobQueue(object): raise ValueError('next_t is None') if isinstance(next_t, datetime.datetime): - next_t = (next_t - datetime.datetime.now()).total_seconds() + next_t = (next_t - datetime.datetime.now(next_t.tzinfo)).total_seconds() elif isinstance(next_t, datetime.time): next_datetime = datetime.datetime.combine(datetime.date.today(), next_t) diff --git a/tests/test_jobqueue.py b/tests/test_jobqueue.py index 083a3d194..691fb0a21 100644 --- a/tests/test_jobqueue.py +++ b/tests/test_jobqueue.py @@ -184,6 +184,24 @@ class TestJobQueue(object): sleep(0.06) assert pytest.approx(self.job_time) == expected_time + def test_datetime_with_timezone_job_run_once(self, job_queue): + # Test that run_once jobs work with timezone aware datetimes. + offset = datetime.timedelta(hours=-3) + when = datetime.datetime.now(datetime.timezone(offset)) + + job_queue.run_once(self.job_run_once, when) + sleep(0.01) + assert self.result == 1 + + def test_datetime_with_timezone_job_run_repeating(self, job_queue): + # Test that run_repeating jobs work with timezone aware datetimes. + offset = datetime.timedelta(hours=5) + now_with_offset = datetime.datetime.now(datetime.timezone(offset)) + + job_queue.run_repeating(self.job_run_once, interval=0.01, first=now_with_offset) + sleep(0.015) + assert self.result == 2 + def test_time_unit_dt_time_today(self, job_queue): # Testing running at a specific time today delta = 0.05