8686
8787from dateutil import parser
8888from typing_extensions import Never
89- from whenever import Instant , LocalDateTime , ZonedDateTime
9089
9190
9291class AirbyteDateTime (datetime ):
@@ -138,6 +137,18 @@ def from_datetime(cls, dt: datetime) -> "AirbyteDateTime":
138137 dt .tzinfo or timezone .utc ,
139138 )
140139
140+ @classmethod
141+ def from_timestamp (cls , timestamp : float ) -> "AirbyteDateTime" :
142+ """Creates an AirbyteDateTime from a Unix timestamp in seconds.
143+
144+ Args:
145+ timestamp: A Unix timestamp in seconds (float).
146+
147+ Returns:
148+ AirbyteDateTime: A new timezone-aware datetime instance (UTC).
149+ """
150+ return AirbyteDateTime .from_datetime (datetime .fromtimestamp (timestamp , tz = timezone .utc ))
151+
141152 def to_datetime (self ) -> datetime :
142153 """Converts this AirbyteDateTime to a standard datetime object.
143154
@@ -400,8 +411,7 @@ def ab_datetime_parse(dt_str: str | int) -> AirbyteDateTime:
400411 raise ValueError ("Timestamp cannot be negative" )
401412 if len (str (abs (timestamp ))) > 10 :
402413 raise ValueError ("Timestamp value too large" )
403- instant = Instant .from_timestamp (timestamp )
404- return AirbyteDateTime .from_datetime (instant .py_datetime ())
414+ return AirbyteDateTime .from_timestamp (timestamp )
405415
406416 if not isinstance (dt_str , str ):
407417 raise ValueError (
@@ -414,8 +424,7 @@ def ab_datetime_parse(dt_str: str | int) -> AirbyteDateTime:
414424 year , month , day = map (int , dt_str .split ("-" ))
415425 if not (1 <= month <= 12 and 1 <= day <= 31 ):
416426 raise ValueError (f"Invalid date format: { dt_str } " )
417- instant = Instant .from_utc (year , month , day , 0 , 0 , 0 )
418- return AirbyteDateTime .from_datetime (instant .py_datetime ())
427+ return AirbyteDateTime (year , month , day , 0 , 0 , 0 )
419428 except (ValueError , TypeError ):
420429 raise ValueError (f"Invalid date format: { dt_str } " )
421430
0 commit comments