diff --git a/pendulum/datetime.py b/pendulum/datetime.py index 4e2762d3..727c1e38 100644 --- a/pendulum/datetime.py +++ b/pendulum/datetime.py @@ -1503,6 +1503,8 @@ def replace( microsecond = self.microsecond if tzinfo is True: tzinfo = self.tzinfo + if fold is None: + fold = self.fold transition_rule = pendulum.POST_TRANSITION if fold is not None: diff --git a/tests/datetime/test_fluent_setters.py b/tests/datetime/test_fluent_setters.py index 1b5d1576..eb2786b7 100644 --- a/tests/datetime/test_fluent_setters.py +++ b/tests/datetime/test_fluent_setters.py @@ -139,18 +139,41 @@ def test_fluid_at_with_transition(): assert 0 == new.second -def test_replace_tzinfo(): - d = pendulum.datetime(2016, 7, 2, 0, 41, 20) +def test_replace_tzinfo_dls_off(): + d = pendulum.datetime(2016, 3, 27, 0, 30) # 30 min before DLS turning on new = d.replace(tzinfo=pendulum.timezone("Europe/Paris")) + assert_datetime(new, 2016, 3, 27, 0, 30) + assert not new.is_dst() + assert new.offset == 3600 + assert new.timezone_name == "Europe/Paris" + + +def test_replace_tzinfo_dls_transitioning_on(): + d = pendulum.datetime(2016, 3, 27, 1, 30) # In middle of turning on + new = d.replace(tzinfo=pendulum.timezone("Europe/Paris")) + + assert_datetime(new, 2016, 3, 27, 1, 30) + assert not new.is_dst() + assert new.offset == 3600 + assert new.timezone_name == "Europe/Paris" + + +def test_replace_tzinfo_dls_on(): + d = pendulum.datetime(2016, 10, 30, 0, 30) # 30 min before DLS turning off + new = d.replace(tzinfo=pendulum.timezone("Europe/Paris")) + + assert_datetime(new, 2016, 10, 30, 0, 30) + assert new.is_dst() + assert new.offset == 7200 assert new.timezone_name == "Europe/Paris" -def test_replace_tzinfo_dst(): - d = pendulum.datetime(2013, 3, 31, 2, 30) +def test_replace_tzinfo_dls_transitioning_off(): + d = pendulum.datetime(2016, 10, 30, 1, 30) # In the middle of turning off new = d.replace(tzinfo=pendulum.timezone("Europe/Paris")) - assert_datetime(new, 2013, 3, 31, 3, 30) + assert_datetime(new, 2016, 10, 30, 1, 30) assert new.is_dst() assert new.offset == 7200 assert new.timezone_name == "Europe/Paris" diff --git a/tests/datetime/test_replace.py b/tests/datetime/test_replace.py new file mode 100644 index 00000000..4fedc569 --- /dev/null +++ b/tests/datetime/test_replace.py @@ -0,0 +1,59 @@ +import pendulum + +from ..conftest import assert_datetime + + +def test_replace_tzinfo_dls_off(): + utc = pendulum.datetime(2016, 3, 27, 0, 30) # 30 min before DLS turning on + in_paris = utc.in_tz("Europe/Paris") + + assert_datetime(in_paris, 2016, 3, 27, 1, 30, 0) + + in_paris = in_paris.replace(second=1) + + assert_datetime(in_paris, 2016, 3, 27, 1, 30, 1) + assert not in_paris.is_dst() + assert in_paris.offset == 3600 + assert in_paris.timezone_name == "Europe/Paris" + + +def test_replace_tzinfo_dls_transitioning_on(): + utc = pendulum.datetime(2016, 3, 27, 1, 30) # In middle of turning on + in_paris = utc.in_tz("Europe/Paris") + + assert_datetime(in_paris, 2016, 3, 27, 3, 30, 0) + + in_paris = in_paris.replace(second=1) + + assert_datetime(in_paris, 2016, 3, 27, 3, 30, 1) + assert in_paris.is_dst() + assert in_paris.offset == 7200 + assert in_paris.timezone_name == "Europe/Paris" + + +def test_replace_tzinfo_dls_on(): + utc = pendulum.datetime(2016, 10, 30, 0, 30) # 30 min before DLS turning off + in_paris = utc.in_tz("Europe/Paris") + + assert_datetime(in_paris, 2016, 10, 30, 2, 30, 0) + + in_paris = in_paris.replace(second=1) + + assert_datetime(in_paris, 2016, 10, 30, 2, 30, 1) + assert in_paris.is_dst() + assert in_paris.offset == 7200 + assert in_paris.timezone_name == "Europe/Paris" + + +def test_replace_tzinfo_dls_transitioning_off(): + utc = pendulum.datetime(2016, 10, 30, 1, 30) # In the middle of turning off + in_paris = utc.in_tz("Europe/Paris") + + assert_datetime(in_paris, 2016, 10, 30, 2, 30, 0) + + in_paris = in_paris.replace(second=1) + + assert_datetime(in_paris, 2016, 10, 30, 2, 30, 1) + assert not in_paris.is_dst() + assert in_paris.offset == 3600 + assert in_paris.timezone_name == "Europe/Paris"