Skip to content

Commit

Permalink
Merge 7fb6fa8 into 7ab021c
Browse files Browse the repository at this point in the history
  • Loading branch information
sarnold committed Nov 12, 2018
2 parents 7ab021c + 7fb6fa8 commit 40ba696
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 10 deletions.
22 changes: 15 additions & 7 deletions schedule/__init__.py
Expand Up @@ -44,6 +44,14 @@
import random
import time

try:
from datetime import timezone
utc = timezone.utc
except ImportError:
from schedule.timezone import UTC
utc = UTC()


logger = logging.getLogger('schedule')


Expand Down Expand Up @@ -149,7 +157,7 @@ def idle_seconds(self):
:return: Number of seconds until
:meth:`next_run <Scheduler.next_run>`.
"""
return (self.next_run - datetime.datetime.now()).total_seconds()
return (self.next_run - datetime.datetime.now(utc)).total_seconds()


class Job(object):
Expand Down Expand Up @@ -191,7 +199,7 @@ def __lt__(self, other):

def __repr__(self):
def format_time(t):
return t.strftime('%Y-%m-%d %H:%M:%S') if t else '[never]'
return t.strftime('%Y-%m-%d %H:%M:%S %Z') if t else '[never]'

timestats = '(last run: %s, next run: %s)' % (
format_time(self.last_run), format_time(self.next_run))
Expand Down Expand Up @@ -396,7 +404,7 @@ def should_run(self):
"""
:return: ``True`` if the job should be run now.
"""
return datetime.datetime.now() >= self.next_run
return datetime.datetime.now(utc) >= self.next_run

def run(self):
"""
Expand All @@ -406,7 +414,7 @@ def run(self):
"""
logger.info('Running job %s', self)
ret = self.job_func()
self.last_run = datetime.datetime.now()
self.last_run = datetime.datetime.now(utc)
self._schedule_next_run()
return ret

Expand All @@ -423,7 +431,7 @@ def _schedule_next_run(self):
interval = self.interval

self.period = datetime.timedelta(**{self.unit: interval})
self.next_run = datetime.datetime.now() + self.period
self.next_run = datetime.datetime.now(utc) + self.period
if self.start_day is not None:
assert self.unit == 'weeks'
weekdays = (
Expand Down Expand Up @@ -454,15 +462,15 @@ def _schedule_next_run(self):
# If we are running for the first time, make sure we run
# at the specified time *today* (or *this hour*) as well
if not self.last_run:
now = datetime.datetime.now()
now = datetime.datetime.now(utc)
if (self.unit == 'days' and self.at_time > now.time() and
self.interval == 1):
self.next_run = self.next_run - datetime.timedelta(days=1)
elif self.unit == 'hours' and self.at_time.minute > now.minute:
self.next_run = self.next_run - datetime.timedelta(hours=1)
if self.start_day is not None and self.at_time is not None:
# Let's see if we will still make that time we specified today
if (self.next_run - datetime.datetime.now()).days >= 7:
if (self.next_run - datetime.datetime.now(utc)).days >= 7:
self.next_run -= self.period


Expand Down
18 changes: 18 additions & 0 deletions schedule/timezone.py
@@ -0,0 +1,18 @@
import datetime


class UTC(datetime.tzinfo):
"""tzinfo derived concrete class named "UTC" with offset of 0"""
# can be configured here
_offset = datetime.timedelta(seconds=0)
_dst = datetime.timedelta(0)
_name = "UTC"

def utcoffset(self, dt):
return self.__class__._offset

def dst(self, dt):
return self.__class__._dst

def tzname(self, dt):
return self.__class__._name
15 changes: 12 additions & 3 deletions test_schedule.py
Expand Up @@ -11,6 +11,13 @@
import schedule
from schedule import every

try:
from datetime import timezone
utc = timezone.utc
except ImportError:
from schedule.timezone import UTC
utc = UTC()


def make_mock_job(name=None):
job = mock.Mock()
Expand All @@ -36,9 +43,10 @@ def today(cls):
return cls(self.year, self.month, self.day)

@classmethod
def now(cls):
def now(cls, tz=None):
return cls(self.year, self.month, self.day,
self.hour, self.minute)
self.hour, self.minute).replace(tzinfo=tz)

self.original_datetime = datetime.datetime
datetime.datetime = MockDate

Expand Down Expand Up @@ -258,7 +266,8 @@ def test_next_run_property(self):
every().hour.do(hourly_job)
assert len(schedule.jobs) == 2
# Make sure the hourly job is first
assert schedule.next_run() == original_datetime(2010, 1, 6, 14, 16)
assert schedule.next_run() == original_datetime(2010, 1, 6, 14, 16,
tzinfo=utc)
assert schedule.idle_seconds() == 60 * 60

def test_cancel_job(self):
Expand Down
3 changes: 3 additions & 0 deletions tox.ini
Expand Up @@ -6,6 +6,9 @@ envlist = py27, py36, docs
3.5 = py35, docs
3.6 = py36, docs

[flake8]
max-line-length = 90

[testenv]
deps = -rrequirements-dev.txt
commands =
Expand Down

0 comments on commit 40ba696

Please sign in to comment.