From fc1c89754ed34ae523c538e883aa4d195954a148 Mon Sep 17 00:00:00 2001 From: AryanRG Date: Sat, 17 Oct 2026 10:19:20 +0530 Subject: [PATCH] Preserve fold in DateTime.time() --- src/pendulum/datetime.py | 4 +++- tests/datetime/test_behavior.py | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/pendulum/datetime.py b/src/pendulum/datetime.py index 96aff25b2..f7b45503d 100644 --- a/src/pendulum/datetime.py +++ b/src/pendulum/datetime.py @@ -313,7 +313,9 @@ def date(self) -> Date: return Date(self.year, self.month, self.day) def time(self) -> Time: - return Time(self.hour, self.minute, self.second, self.microsecond) + return Time( + self.hour, self.minute, self.second, self.microsecond, fold=self.fold + ) def naive(self) -> Self: """ diff --git a/tests/datetime/test_behavior.py b/tests/datetime/test_behavior.py index 3ccfc421e..880807c30 100644 --- a/tests/datetime/test_behavior.py +++ b/tests/datetime/test_behavior.py @@ -50,6 +50,44 @@ def test_time(p, dt): assert p.time() == dt.time() +@pytest.mark.parametrize("fold", [0, 1]) +@pytest.mark.parametrize( + "tzinfo", + [ + None, + datetime_timezone.utc, + zoneinfo.ZoneInfo("America/New_York"), + zoneinfo.ZoneInfo("Australia/Lord_Howe"), + ], +) +def test_time_preserves_fold(fold, tzinfo): + native = datetime(2024, 11, 3, 1, 30, 12, 345678, tzinfo=tzinfo, fold=fold) + dt = pendulum.DateTime(2024, 11, 3, 1, 30, 12, 345678, tzinfo=tzinfo, fold=fold) + + result = dt.time() + + assert isinstance(result, pendulum.Time) + assert result == native.time() + assert result.tzinfo is None + assert result.fold == native.time().fold + + +@pytest.mark.parametrize("fold", [0, 1]) +@pytest.mark.parametrize( + ("tz", "year", "month", "day", "hour", "minute"), + [ + ("America/New_York", 2024, 11, 3, 1, 30), + ("Australia/Lord_Howe", 2024, 4, 7, 1, 45), + ], +) +def test_time_round_trip_during_fold(fold, tz, year, month, day, hour, minute): + dt = pendulum.datetime(year, month, day, hour, minute, tz=tz, fold=fold) + + rebuilt = datetime.combine(dt.date(), dt.time(), tzinfo=dt.tzinfo) + + assert rebuilt.timestamp() == dt.timestamp() + + def test_timetz(p, dt): assert p.timetz() == dt.timetz()