summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkiorky <kiorky@cryptelium.net>2022-09-06 18:31:07 +0200
committerGitHub <noreply@github.com>2022-09-06 18:31:07 +0200
commit614fd3fa09d85469830cc6bac785931cbc69f9ab (patch)
treebdb8e92d897b627f38ec9489f0e9cf62f04fd755
parentbb5a45196e5f8f15fd0890f4ee5e9697671a3fe2 (diff)
parent3a99a259eb231bd9cf17b5b06ceeb4bff353698b (diff)
downloadcroniter-614fd3fa09d85469830cc6bac785931cbc69f9ab.tar.gz
Merge pull request #21 from snapiri/croniter_range_infinite_loop
Fix croniter_range infinite loop
-rw-r--r--src/croniter/croniter.py8
-rwxr-xr-xsrc/croniter/tests/test_croniter_range.py14
2 files changed, 20 insertions, 2 deletions
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py
index 16d784f..1e4b199 100644
--- a/src/croniter/croniter.py
+++ b/src/croniter/croniter.py
@@ -279,8 +279,12 @@ class croniter(object):
or (lag < 0 and
((3600 * abs(lag_hours) + abs(lag)) >= hours_before_midnight * 3600))
):
- dtresult = dtresult - datetime.timedelta(seconds=lag)
- result = self._datetime_to_timestamp(dtresult)
+ dtresult_adjusted = dtresult - datetime.timedelta(seconds=lag)
+ result_adjusted = self._datetime_to_timestamp(dtresult_adjusted)
+ # Do the actual adjust only if the result time actually exists
+ if self._timestamp_to_datetime(result_adjusted).tzinfo == dtresult_adjusted.tzinfo:
+ dtresult = dtresult_adjusted
+ result = result_adjusted
self.dst_start_time = result
self.cur = result
if issubclass(ret_type, datetime.datetime):
diff --git a/src/croniter/tests/test_croniter_range.py b/src/croniter/tests/test_croniter_range.py
index 29fc0d0..e57e4e0 100755
--- a/src/croniter/tests/test_croniter_range.py
+++ b/src/croniter/tests/test_croniter_range.py
@@ -160,6 +160,20 @@ class CroniterRangeTest(base.TestCase):
except CroniterBadTypeRangeError:
self.fail('should not be triggered')
+ def test_dst_iter(self):
+ tz = pytz.timezone('Asia/Hebron')
+ now = datetime(2022, 3, 26, 0, 0, 0, tzinfo=tz)
+ it = croniter('0 0 * * *', now)
+ ret = [
+ it.get_next(datetime).isoformat(),
+ it.get_next(datetime).isoformat(),
+ it.get_next(datetime).isoformat(),
+ ]
+ self.assertEqual(ret, [
+ '2022-03-26T00:00:00+02:00',
+ '2022-03-27T01:00:00+03:00',
+ '2022-03-28T00:00:00+03:00'])
+
if __name__ == '__main__':
unittest.main()