From ab3af8b9a0b64c0c9d1cff6f1a8a5ddb782aa2ec Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 02:12:52 +0000 Subject: [PATCH] fix: improve timezone offset validation Co-Authored-By: Aaron Steers --- airbyte_cdk/utils/datetime_helpers.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/airbyte_cdk/utils/datetime_helpers.py b/airbyte_cdk/utils/datetime_helpers.py index 480fca25..d53b4653 100644 --- a/airbyte_cdk/utils/datetime_helpers.py +++ b/airbyte_cdk/utils/datetime_helpers.py @@ -404,13 +404,20 @@ def ab_datetime_parse(dt_str: Union[str, int]) -> AirbyteDateTime: raise ValueError(f"Invalid timezone format: {dt_str}") # Check for invalid timezone offsets - if "+" in dt_str or "-" in dt_str: - # Find timezone offset part (after + or -) - offset_part = dt_str.split("+")[-1] if "+" in dt_str else dt_str.split("-")[-1] - if ":" in offset_part: - hours, minutes = map(int, offset_part.split(":")) + if "+" in dt_str: + parts = dt_str.split("+") + if len(parts) == 2 and ":" in parts[1]: + hours, minutes = map(int, parts[1].split(":")) if hours >= 24 or minutes >= 60: - raise ValueError(f"Invalid timezone offset: {offset_part}") + raise ValueError(f"Invalid timezone offset: +{parts[1]}") + elif dt_str.endswith("Z"): + pass # Valid UTC timezone marker + elif "-" in dt_str[13:]: # Skip date part and time part + parts = dt_str[13:].split("-") + if len(parts) == 2 and ":" in parts[1]: + hours, minutes = map(int, parts[1].split(":")) + if hours >= 24 or minutes >= 60: + raise ValueError(f"Invalid timezone offset: -{parts[1]}") # Try parsing with whenever's RFC3339 parser first try: