from datetime import datetime, timedelta
def compare_dates(scheduled_run_start, actual_run_start, tolerance=timedelta(seconds=0)):
"""
Compares two date/time values, handling potential edge cases.
Args:
scheduled_run_start (datetime): The scheduled start time.
actual_run_start (datetime): The actual start time.
tolerance (timedelta, optional): Allowed time difference. Defaults to 0.
Returns:
str: A string indicating the comparison result.
"On time" if within tolerance.
"Early" if actual is before scheduled.
"Late" if actual is after scheduled.
"Invalid input" if inputs are invalid.
"""
if not isinstance(scheduled_run_start, datetime) or not isinstance(actual_run_start, datetime):
return "Invalid input" # Handle invalid input types
if scheduled_run_start > actual_run_start + tolerance:
return "Late"
elif scheduled_run_start < actual_run_start - tolerance:
return "Early"
else:
return "On time"
if __name__ == '__main__':
# Test cases
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 10))) # On time
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 9, 59, 59))) # Early
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 20))) # Late
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 0))) # On time
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 0), timedelta(minutes=1))) # On time with tolerance
print(compare_dates("not a datetime", datetime(2023, 10, 27, 10, 0, 0))) # Invalid input
print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), "not a datetime")) # Invalid input
Add your comment