import datetime SECONDS_PER_MINUTE = 60 MINUTES_PER_HOUR = 60 SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR def seconds_to_iso8601_duration(seconds: int) -> str: hours, minutes_in_seconds = divmod(seconds, SECONDS_PER_HOUR) minutes, seconds = divmod(minutes_in_seconds, SECONDS_PER_MINUTE) return f"PT{hours}H{minutes}M{seconds}S" def convert_date_to_string(date: datetime.date, date_format: str = "%Y-%m-%d") -> str: return date.strftime(date_format) def get_datetime_from_string(date_string: str) -> datetime.datetime: """Get datetime from string and expected known formats.""" known_formats = [ "%Y-%m-%d", "%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%SZ", ] for fmt in known_formats: try: return datetime.datetime.strptime(date_string, fmt) except ValueError: continue raise ValueError(f"Date '{date_string}' is not in a known format.") def get_datetime_from_string_or_none( date_string: str | None, ) -> datetime.datetime | None: """Get datetime from string. Handle None input.""" if date_string is None: return None return get_datetime_from_string(date_string)