1. from datetime import datetime, timedelta
  2. def compare_dates(scheduled_run_start, actual_run_start, tolerance=timedelta(seconds=0)):
  3. """
  4. Compares two date/time values, handling potential edge cases.
  5. Args:
  6. scheduled_run_start (datetime): The scheduled start time.
  7. actual_run_start (datetime): The actual start time.
  8. tolerance (timedelta, optional): Allowed time difference. Defaults to 0.
  9. Returns:
  10. str: A string indicating the comparison result.
  11. "On time" if within tolerance.
  12. "Early" if actual is before scheduled.
  13. "Late" if actual is after scheduled.
  14. "Invalid input" if inputs are invalid.
  15. """
  16. if not isinstance(scheduled_run_start, datetime) or not isinstance(actual_run_start, datetime):
  17. return "Invalid input" # Handle invalid input types
  18. if scheduled_run_start > actual_run_start + tolerance:
  19. return "Late"
  20. elif scheduled_run_start < actual_run_start - tolerance:
  21. return "Early"
  22. else:
  23. return "On time"
  24. if __name__ == '__main__':
  25. # Test cases
  26. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 10))) # On time
  27. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 9, 59, 59))) # Early
  28. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 20))) # Late
  29. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 0))) # On time
  30. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), datetime(2023, 10, 27, 10, 0, 0), timedelta(minutes=1))) # On time with tolerance
  31. print(compare_dates("not a datetime", datetime(2023, 10, 27, 10, 0, 0))) # Invalid input
  32. print(compare_dates(datetime(2023, 10, 27, 10, 0, 0), "not a datetime")) # Invalid input

Add your comment