from datetime import datetime, date, time, timedelta def calculate_sleep_duration(yesterday_date: date, yesterday_sleep: time, today_date: date, today_wake: time) -> float: sleep_dt = datetime.combine(yesterday_date, yesterday_sleep) # If the user went to sleep past midnight (e.g., 01:00 AM), # it actually belongs to 'today_date' chronologically. if yesterday_sleep < time(12, 0): # Assuming any sleep time before noon is past midnight sleep_dt += timedelta(days=1) wake_dt = datetime.combine(today_date, today_wake) duration_td = wake_dt - sleep_dt # Fallback in case of weird overlapping data if duration_td.total_seconds() < 0: return 0.0 return round(duration_td.total_seconds() / 3600.0, 2)