From 57f75f2efe1214979acb2aba607bd3007e0b5316 Mon Sep 17 00:00:00 2001 From: aurora324 <3050517330@qq.com> Date: Tue, 20 May 2025 23:21:21 +0800 Subject: [PATCH] handle DST properly #1209 --- arrow/arrow.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arrow/arrow.py b/arrow/arrow.py index 9d1f5e30..92f41ec8 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -1035,7 +1035,14 @@ def shift(self, check_imaginary: bool = True, **kwargs: Any) -> "Arrow": relative_kwargs.pop("quarters", 0) * self._MONTHS_PER_QUARTER ) - current = self._datetime + relativedelta(**relative_kwargs) + # current = self._datetime + relativedelta(**relative_kwargs) + original_tz = self.tzinfo + if self._datetime.tzinfo is not None: + utc_dt = self._datetime.astimezone(dateutil_tz.UTC) + current = utc_dt + relativedelta(**relative_kwargs) + current = current.astimezone(original_tz) + else: + current = self._datetime + relativedelta(**relative_kwargs) # If check_imaginary is True, perform the check for imaginary times (DST transitions) if check_imaginary and not dateutil_tz.datetime_exists(current):