taichino / croniter

croniter is a python module to provide iteration for datetime object.
http://github.com/taichino/croniter
387 stars 105 forks source link

Does not work on DST changes (depends on system timezone) #35

Closed mateuszf closed 7 years ago

mateuszf commented 10 years ago

croniter 0.3.5, Python 2.7.8 Consider test case executed on machine with 'Europe/Warsaw' (UTC+1) timezone, change from DST to normal occurs on 2014-10-26 02:59 +2:00 (UTC 00:59) -> 02:00 +1:00 (UTC 01:00):

from datetime import datetime
from croniter import croniter
import pytz

Using datetime objects:

Before change (naive datetime) - VALID
cr = croniter('0 * * * *', datetime(2014, 10, 26, 0))
print 'next = ', cr.get_next(datetime)   # 2014-10-26 01:00:00, OK
print 'prev = ', cr.get_prev(datetime)   # 2014-10-26 00:00:00, OK 
Before change (UTC datetime) - INVALID
cr = croniter('0 * * * *', datetime(2014, 10, 26, 0).replace(tzinfo=pytz.utc))
print 'next = ', cr.get_next(datetime)   # 2014-10-26 02:00:00+00:00, INVALID
print 'prev = ', cr.get_prev(datetime)   # 2014-10-26 02:00:00+00:00, INVALID
After change (naive datetime) - INVALID
cr = croniter('0 * * * *', datetime(2014, 10, 26, 1))
print 'next = ', cr.get_next(datetime)   # 2014-10-26 02:00:00, OK
print 'prev = ', cr.get_prev(datetime)   # 2014-10-26 02:00:00, INVALID
After change (UTC datetime) - INVALID
cr = croniter('0 * * * *', datetime(2014, 10, 26, 1).replace(tzinfo=pytz.utc))
print 'next = ', cr.get_next(datetime)   # 2014-10-26 03:00:00+00:00, INVALID
print 'prev = ', cr.get_prev(datetime)   # 2014-10-26 02:00:00+00:00, INVALID

Using timestamps:

Before change - INVALID
cr = croniter('0 * * * *', 1414281600) # UTC 00:00
print 'next = ', cr.get_next()   # 1414288800.0 (UTC 02:00), INVALID
print 'prev = ', cr.get_prev()   # 1414285200.0 (UTC 01:00), INVALID
After change - VALID
cr = croniter('0 * * * *', 1414285200) # UTC 01:00
print 'next = ', cr.get_next()   # 1414288800.0 (UTC 02:00), OK
print 'prev = ', cr.get_prev()   # 1414285200.0 (UTC 01:00), OK

Despite the fact that timestamps are UTC hardcoded all of test cases give much better results when system timezone is changed to e.g. Fiji UTC+12:00

josegonzalez commented 8 years ago

This can be closed.