diff --git a/src/pendulum/datetime.py b/src/pendulum/datetime.py index 6452f3b8..5367d315 100644 --- a/src/pendulum/datetime.py +++ b/src/pendulum/datetime.py @@ -1357,17 +1357,32 @@ def _getstate( def __reduce__( self, ) -> tuple[ - type[Self], tuple[int, int, int, int, int, int, int, datetime.tzinfo | None] + type[Self], + tuple[int, int, int, int, int, int, int, datetime.tzinfo | None], ]: return self.__reduce_ex__(2) def __reduce_ex__( self, protocol: SupportsIndex ) -> tuple[ - type[Self], tuple[int, int, int, int, int, int, int, datetime.tzinfo | None] + type[Self], + tuple[int, int, int, int, int, int, int, datetime.tzinfo | None], ]: return self.__class__, self._getstate(protocol) + def __deepcopy__(self, _: dict[int, Self]) -> Self: + return self.__class__( + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + self.microsecond, + tzinfo=self.tz, + fold=self.fold, + ) + def _cmp(self, other: datetime.datetime, **kwargs: Any) -> int: # Fix for pypy which compares using this method # which would lead to infinite recursion if we didn't override diff --git a/tests/datetime/test_behavior.py b/tests/datetime/test_behavior.py index e02323ab..76de1d60 100644 --- a/tests/datetime/test_behavior.py +++ b/tests/datetime/test_behavior.py @@ -158,6 +158,14 @@ def test_deepcopy(): assert dt == deepcopy(dt) +def test_deepcopy_on_transition(): + dt = pendulum.datetime(2023, 11, 5, 1, 0, 0, tz="US/Pacific") + clone = deepcopy(dt) + + assert dt == clone + assert dt.offset == clone.offset + + def test_pickle_timezone(): dt1 = pendulum.timezone("Europe/Amsterdam") s = pickle.dumps(dt1)