@@ -111,21 +111,20 @@ def _convert_timestamp_with_timezone(self, timestamp_value):
111
111
# Create UTC datetime first
112
112
utc_dt = datetime .datetime .utcfromtimestamp (timestamp_value )
113
113
114
- # If timezone is UTC, return as-is
114
+ # If timezone is UTC, return timezone-aware UTC datetime
115
115
if self .mysql_timezone == "UTC" :
116
- return utc_dt
116
+ return utc_dt . replace ( tzinfo = datetime . timezone . utc )
117
117
118
- # Convert to configured timezone
118
+ # Convert to configured timezone but keep timezone-aware
119
119
try :
120
- # Treat the timestamp as if it were in the configured timezone
120
+ # Start with UTC timezone-aware datetime
121
+ utc_dt_aware = utc_dt .replace (tzinfo = datetime .timezone .utc )
122
+ # Convert to target timezone
121
123
target_tz = zoneinfo .ZoneInfo (self .mysql_timezone )
122
- # Replace timezone info to indicate it's in the target timezone
123
- dt_with_tz = utc_dt .replace (tzinfo = target_tz )
124
- # Convert back to naive datetime (removing timezone info)
125
- return dt_with_tz .replace (tzinfo = None )
124
+ return utc_dt_aware .astimezone (target_tz )
126
125
except zoneinfo .ZoneInfoNotFoundError :
127
126
# If timezone is invalid, fall back to UTC
128
- return utc_dt
127
+ return utc_dt . replace ( tzinfo = datetime . timezone . utc )
129
128
130
129
def _read_column_data (self , cols_bitmap , row_image_type = None ):
131
130
"""Use for WRITE, UPDATE and DELETE events.
@@ -261,7 +260,7 @@ def __read_values_name(
261
260
self .__none_sources [name ] = NONE_SOURCE .OUT_OF_DATE_RANGE
262
261
return ret
263
262
elif column .type == FIELD_TYPE .TIMESTAMP :
264
- return self . _convert_timestamp_with_timezone (self .packet .read_uint32 ())
263
+ return datetime . datetime . utcfromtimestamp (self .packet .read_uint32 ())
265
264
266
265
# For new date format:
267
266
elif column .type == FIELD_TYPE .DATETIME2 :
@@ -273,7 +272,7 @@ def __read_values_name(
273
272
return self .__read_time2 (column )
274
273
elif column .type == FIELD_TYPE .TIMESTAMP2 :
275
274
return self .__add_fsp_to_time (
276
- self . _convert_timestamp_with_timezone (self .packet .read_int_be_by_size (4 )),
275
+ datetime . datetime . utcfromtimestamp (self .packet .read_int_be_by_size (4 )),
277
276
column ,
278
277
)
279
278
elif column .type == FIELD_TYPE .LONGLONG :
0 commit comments