""" Time Conversion Utilities Handles conversion between Unix timestamps and EST datetime """ from datetime import datetime, timezone import pytz class TimeConverter: """Class to handle time conversions between Unix timestamps and EST""" # Eastern Time Zone (handles both EST and EDT automatically) EST = pytz.timezone('US/Eastern') def __init__(self): pass def est_to_unix(self, est_datetime_str: str) -> int: """ Convert EST datetime string to Unix timestamp Args: est_datetime_str: DateTime string in EST timezone Supported formats: - "YYYY-MM-DD HH:MM:SS" - "YYYY-MM-DD HH:MM" - "MM/DD/YYYY HH:MM:SS" - "MM/DD/YYYY HH:MM" Returns: Unix timestamp (seconds since epoch) Example: >>> converter = TimeConverter() >>> converter.est_to_unix("2025-01-15 10:30:00") 1736954400 """ # Try different datetime formats formats = [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%m/%d/%Y %H:%M:%S", "%m/%d/%Y %H:%M", "%Y-%m-%d", ] dt = None for fmt in formats: try: dt = datetime.strptime(est_datetime_str, fmt) break except ValueError: continue if dt is None: raise ValueError( f"Could not parse datetime string: {est_datetime_str}. " f"Supported formats: YYYY-MM-DD HH:MM:SS, MM/DD/YYYY HH:MM:SS, etc." ) # Localize to EST timezone est_dt = self.EST.localize(dt) # Convert to Unix timestamp unix_timestamp = int(est_dt.timestamp()) return unix_timestamp def unix_to_est(self, unix_timestamp: int) -> str: """ Convert Unix timestamp to EST datetime string Args: unix_timestamp: Unix timestamp (seconds since epoch) Returns: Datetime string in EST timezone (format: "YYYY-MM-DD HH:MM:SS EST") Example: >>> converter = TimeConverter() >>> converter.unix_to_est(1736954400) "2025-01-15 10:30:00 EST" """ # Create UTC datetime from timestamp utc_dt = datetime.fromtimestamp(unix_timestamp, tz=timezone.utc) # Convert to EST est_dt = utc_dt.astimezone(self.EST) # Format as string return est_dt.strftime("%Y-%m-%d %H:%M:%S %Z") def unix_to_est_datetime(self, unix_timestamp: int) -> datetime: """ Convert Unix timestamp to EST datetime object Args: unix_timestamp: Unix timestamp (seconds since epoch) Returns: Datetime object in EST timezone """ # Create UTC datetime from timestamp utc_dt = datetime.fromtimestamp(unix_timestamp, tz=timezone.utc) # Convert to EST est_dt = utc_dt.astimezone(self.EST) return est_dt def validate_time_range(self, start_unix: int, end_unix: int) -> bool: """ Validate that start time is before end time Args: start_unix: Start time Unix timestamp end_unix: End time Unix timestamp Returns: True if valid, raises ValueError if invalid """ if start_unix >= end_unix: raise ValueError( f"Start time ({self.unix_to_est(start_unix)}) must be before " f"end time ({self.unix_to_est(end_unix)})" ) return True # Example usage and tests if __name__ == "__main__": converter = TimeConverter() print("=== Time Conversion Examples ===\n") # Test EST to Unix test_datetime = "2025-11-15 14:30:00" print(f"EST to Unix:") print(f" Input: {test_datetime}") unix_ts = converter.est_to_unix(test_datetime) print(f" Output: {unix_ts}\n") # Test Unix to EST print(f"Unix to EST:") print(f" Input: {unix_ts}") est_str = converter.unix_to_est(unix_ts) print(f" Output: {est_str}\n") # Test different date formats print("Testing different input formats:") test_formats = [ "2025-11-15 14:30:00", "2025-11-15 14:30", "11/15/2025 14:30:00", "11/15/2025 14:30", "2025-11-15" ] for fmt in test_formats: try: unix = converter.est_to_unix(fmt) est = converter.unix_to_est(unix) print(f" {fmt:<25} -> {unix} -> {est}") except Exception as e: print(f" {fmt:<25} -> Error: {e}") print("\nValidation test:") try: start = converter.est_to_unix("2025-11-15 10:00:00") end = converter.est_to_unix("2025-11-15 18:00:00") converter.validate_time_range(start, end) print(f" ✓ Valid time range") except ValueError as e: print(f" ✗ {e}")