Skip to content

Commit

Permalink
Merge pull request #153 from jonklein/fix/day_of_week_offsets
Browse files Browse the repository at this point in the history
Fix/day of week offsets
  • Loading branch information
bear committed Feb 17, 2016
2 parents f8fdbfa + 4c9d08b commit e9a3b97
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
20 changes: 19 additions & 1 deletion parsedatetime/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -910,13 +910,31 @@ def _evalModifier(self, modifier, chunk1, chunk2, sourceTime):
sourceTime = sTime
ctx.updateAccuracy(ctx.ACU_HALFDAY)
else:
# unless one of these modifiers is being applied to the
# day-of-week, we want to start with target as the day
# in the current week.
dowOffset = offset
if not modifier in ['next', 'last', 'prior', 'previous']:
dowOffset = 0

wkdy = self.ptc.WeekdayOffsets[wkdy]
diff = self._CalculateDOWDelta(
wd, wkdy, offset, self.ptc.DOWParseStyle,
wd, wkdy, dowOffset, self.ptc.DOWParseStyle,
self.ptc.CurrentDOWParseStyle)
start = datetime.datetime(yr, mth, dy, startHour,
startMinute, startSecond)
target = start + datetime.timedelta(days=diff)

if chunk1 != '':
# consider "one day before thursday": we need to parse chunk1 ("one day")
# and apply according to the offset ("before"), rather than allowing the
# remaining parse step to apply "one day" without the offset direction.
t, subctx = self.parse(chunk1, sourceTime, VERSION_CONTEXT_STYLE)
if subctx.hasDateOrTime:
delta = time.mktime(t) - time.mktime(sourceTime)
target = start + datetime.timedelta(days=diff) + datetime.timedelta(seconds = delta * offset)
chunk1 = ''

sourceTime = target.timetuple()
ctx.updateAccuracy(ctx.ACU_DAY)

Expand Down
34 changes: 34 additions & 0 deletions tests/TestSimpleOffsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,40 @@ def testNow(self):

self.assertExpectedResult(self.cal.parse('now', start), (target, 2))

def testOffsetFromDayOfWeek(self):
self.cal.ptc.StartTimeFromSourceTime = True

s = datetime.datetime(2016, 2, 16) # a Tuesday
t = datetime.datetime(2016, 2, 18) # Thursday of the same week
tPlusOffset = t + datetime.timedelta(hours=1)

start = s.timetuple()
target = t.timetuple()
targetPlusOffset = tPlusOffset.timetuple()

self.assertExpectedResult(
self.cal.parse('Thursday', start), (target, 1))

self.assertExpectedResult(
self.cal.parse('one hour from Thursday', start), (targetPlusOffset, 3))

def testOffsetBeforeDayOfWeek(self):
self.cal.ptc.StartTimeFromSourceTime = True

s = datetime.datetime(2016, 2, 16) # a Tuesday
t = datetime.datetime(2016, 2, 18) # Thursday of the same week
tPlusOffset = t + datetime.timedelta(hours=-1)

start = s.timetuple()
target = t.timetuple()
targetPlusOffset = tPlusOffset.timetuple()

self.assertExpectedResult(
self.cal.parse('Thursday', start), (target, 1))

self.assertExpectedResult(
self.cal.parse('one hour before Thursday', start), (targetPlusOffset, 3))

def testMinutesFromNow(self):
s = datetime.datetime.now()
t = s + datetime.timedelta(minutes=5)
Expand Down

0 comments on commit e9a3b97

Please sign in to comment.