From 3419defe1abf59a63e89936bd3261a947e0af194 Mon Sep 17 00:00:00 2001 From: Jonathan Raffre Date: Wed, 14 Jun 2023 14:35:19 +0200 Subject: [PATCH] fix: handle DST folded dates with start/end_of --- pendulum/datetime.py | 2 +- tests/datetime/test_start_end_of.py | 40 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/pendulum/datetime.py b/pendulum/datetime.py index d265aece..e74ef21f 100644 --- a/pendulum/datetime.py +++ b/pendulum/datetime.py @@ -205,7 +205,7 @@ def set( tz = self.tz return self.__class__.create( - year, month, day, hour, minute, second, microsecond, tz=tz + year, month, day, hour, minute, second, microsecond, tz=tz, fold=self.fold ) @property diff --git a/tests/datetime/test_start_end_of.py b/tests/datetime/test_start_end_of.py index 597dbeb1..1937e74d 100644 --- a/tests/datetime/test_start_end_of.py +++ b/tests/datetime/test_start_end_of.py @@ -277,9 +277,49 @@ def test_start_of_with_transition(): assert d.start_of("year").offset == 3600 +def test_start_of_on_date_before_transition(): + d = pendulum.datetime(2013, 10, 27, 0, 59, 59, tz="UTC").in_timezone("Europe/Paris") + assert d.offset == 7200 + assert d.start_of("minute").offset == 7200 + assert d.start_of("hour").offset == 7200 + assert d.start_of("day").offset == 7200 + assert d.start_of("month").offset == 7200 + assert d.start_of("year").offset == 3600 + + +def test_start_of_on_date_after_transition(): + d = pendulum.datetime(2013, 10, 27, 1, 59, 59, tz="UTC").in_timezone("Europe/Paris") + assert d.offset == 3600 + assert d.start_of("minute").offset == 3600 + assert d.start_of("hour").offset == 3600 + assert d.start_of("day").offset == 7200 + assert d.start_of("month").offset == 7200 + assert d.start_of("year").offset == 3600 + + def test_end_of_with_transition(): d = pendulum.datetime(2013, 3, 31, tz="Europe/Paris") assert d.offset == 3600 assert d.end_of("month").offset == 7200 assert d.end_of("day").offset == 7200 assert d.end_of("year").offset == 3600 + + +def test_end_of_on_date_before_transition(): + d = pendulum.datetime(2013, 10, 27, 0, 0, 0, tz="UTC").in_timezone("Europe/Paris") + assert d.offset == 7200 + assert d.end_of("minute").offset == 7200 + assert d.end_of("hour").offset == 7200 + assert d.end_of("day").offset == 3600 + assert d.end_of("month").offset == 3600 + assert d.end_of("year").offset == 3600 + + +def test_end_of_on_date_after_transition(): + d = pendulum.datetime(2013, 10, 27, 1, 0, 0, tz="UTC").in_timezone("Europe/Paris") + assert d.offset == 3600 + assert d.end_of("minute").offset == 3600 + assert d.end_of("hour").offset == 3600 + assert d.end_of("day").offset == 3600 + assert d.end_of("month").offset == 3600 + assert d.end_of("year").offset == 3600