date.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from datetime import datetime
  2. from tzlocal import get_localzone
  3. from apscheduler.triggers.base import BaseTrigger
  4. from apscheduler.util import convert_to_datetime, datetime_repr, astimezone
  5. class DateTrigger(BaseTrigger):
  6. """
  7. Triggers once on the given datetime. If ``run_date`` is left empty, current time is used.
  8. :param datetime|str run_date: the date/time to run the job at
  9. :param datetime.tzinfo|str timezone: time zone for ``run_date`` if it doesn't have one already
  10. """
  11. __slots__ = 'run_date'
  12. def __init__(self, run_date=None, timezone=None):
  13. timezone = astimezone(timezone) or get_localzone()
  14. if run_date is not None:
  15. self.run_date = convert_to_datetime(run_date, timezone, 'run_date')
  16. else:
  17. self.run_date = datetime.now(timezone)
  18. def get_next_fire_time(self, previous_fire_time, now):
  19. return self.run_date if previous_fire_time is None else None
  20. def __getstate__(self):
  21. return {
  22. 'version': 1,
  23. 'run_date': self.run_date
  24. }
  25. def __setstate__(self, state):
  26. # This is for compatibility with APScheduler 3.0.x
  27. if isinstance(state, tuple):
  28. state = state[1]
  29. if state.get('version', 1) > 1:
  30. raise ValueError(
  31. 'Got serialized data for version %s of %s, but only version 1 can be handled' %
  32. (state['version'], self.__class__.__name__))
  33. self.run_date = state['run_date']
  34. def __str__(self):
  35. return 'date[%s]' % datetime_repr(self.run_date)
  36. def __repr__(self):
  37. return "<%s (run_date='%s')>" % (self.__class__.__name__, datetime_repr(self.run_date))