- if "delta_unit" not in self.context:
- raise ParseException("Missing delta_unit?!")
- unit = self.context["delta_unit"]
- if unit == DateParser.CONSTANT_DAYS:
- timedelta = datetime.timedelta(days=count)
- self.date = self.date + timedelta
- elif unit == DateParser.CONSTANT_WEEKS:
- timedelta = datetime.timedelta(weeks=count)
- self.date = self.date + timedelta
+ if 'delta_unit' not in self.context:
+ raise ParseException('Missing delta_unit?!')
+ unit = self.context['delta_unit']
+ dt = n_timeunits_from_base(count, TimeUnit(unit), date_to_datetime(self.date))
+ self.date = datetime_to_date(dt)
+
+ def exitTimeExpr(self, ctx: dateparse_utilsParser.TimeExprContext) -> None:
+ # Simple time?
+ self.time = datetime.time(
+ self.context['hour'],
+ self.context['minute'],
+ self.context['seconds'],
+ self.context['micros'],
+ tzinfo=self.context.get('tz', None),
+ )
+ if self.time_type == DateParser.PARSE_TYPE_SINGLE_TIME_EXPR:
+ return
+
+ # If we get here there (should be) a relative adjustment to
+ # the time.
+ if 'nth' in self.context:
+ count = self.context['nth']
+ elif 'time_delta_int' in self.context:
+ count = self.context['time_delta_int']
+ else:
+ raise ParseException('Missing delta in relative time.')
+ if count == 0:
+ return
+
+ # Adjust count's sign based on the presence of 'before' or 'after'.
+ if 'time_delta_before_after' in self.context:
+ before_after = self.context['time_delta_before_after'].lower()
+ if (
+ before_after == 'before'
+ or before_after == 'until'
+ or before_after == 'til'
+ or before_after == 'to'
+ ):
+ count = -count
+
+ # What are we counting units of... assume minutes.
+ if 'time_delta_unit' not in self.context:
+ self.timedelta += datetime.timedelta(minutes=count)
+ else:
+ unit = self.context['time_delta_unit']
+ if unit == TimeUnit.SECONDS:
+ self.timedelta += datetime.timedelta(seconds=count)
+ elif unit == TimeUnit.MINUTES:
+ self.timedelta = datetime.timedelta(minutes=count)
+ elif unit == TimeUnit.HOURS:
+ self.timedelta = datetime.timedelta(hours=count)
+ else:
+ raise ParseException(f'Invalid Unit: "{unit}"')
+
+ def exitDeltaPlusMinusExpr(self, ctx: dateparse_utilsParser.DeltaPlusMinusExprContext) -> None:
+ try:
+ n = ctx.nth()
+ if n is None:
+ raise ParseException(f'Bad N in Delta +/- Expr: {ctx.getText()}')
+ n = n.getText()
+ n = self._get_int(n)
+ unit = self._figure_out_date_unit(ctx.deltaUnit().getText().lower())
+ except Exception:
+ raise ParseException(f'Invalid Delta +/-: {ctx.getText()}')
+ else:
+ self.context['delta_int'] = n
+ self.context['delta_unit'] = unit
+
+ def exitNextLastUnit(self, ctx: dateparse_utilsParser.DeltaUnitContext) -> None:
+ try:
+ unit = self._figure_out_date_unit(ctx.getText().lower())
+ except Exception:
+ raise ParseException(f'Bad delta unit: {ctx.getText()}')