in Python/libraries/recognizers-date-time/recognizers_date_time/date_time/base_date.py [0:0]
def parse_implicit_date(self, source: str, reference: datetime) -> DateTimeParseResult:
from .utilities import DateUtils
from .utilities import DateTimeFormatUtil
from .utilities import DateTimeResolutionResult
from .utilities import DayOfWeek
trimmed_source = source.strip()
result = DateTimeResolutionResult()
# handle "on 12"
match = regex.search(self.config.on_regex,
self.config.date_token_prefix + trimmed_source)
if match and match.start() == len(self.config.date_token_prefix) and len(match.group()) == len(trimmed_source):
day = 0
month = reference.month
year = reference.year
day_str = match.group(Constants.DAY_GROUP_NAME)
day = self.config.day_of_month.get(day_str)
result.timex = DateTimeFormatUtil.luis_date(-1, -1, day)
try_str = DateTimeFormatUtil.luis_date(year, month, day)
try_date = datetime.strptime(try_str, '%Y-%m-%d')
future_date: datetime
past_date: datetime
if try_date:
future_date = DateUtils.safe_create_from_min_value(
year, month, day)
past_date = DateUtils.safe_create_from_min_value(
year, month, day)
if future_date < reference:
future_date += datedelta(months=1)
if past_date >= reference:
past_date += datedelta(months=-1)
else:
future_date = DateUtils.safe_create_from_min_value(
year, month + 1, day)
past_date = DateUtils.safe_create_from_min_value(
year, month - 1, day)
result.future_value = future_date
result.past_value = past_date
result.success = True
return result
# handle "today", "the day before yesterday"
match = regex.match(self.config.special_day_regex, trimmed_source)
if match and match.start() == 0 and len(match.group()) == len(trimmed_source):
swift = self.config.get_swift_day(match.group())
today = DateUtils.safe_create_from_min_value(
reference.year, reference.month, reference.day)
value = today + timedelta(days=swift)
result.timex = DateTimeFormatUtil.luis_date_from_datetime(value)
result.future_value = value
result.past_value = value
result.success = True
return result
# handle "next Sunday"
match = regex.match(self.config.next_regex, trimmed_source)
if match and match.start() == 0 and len(match.group()) == len(trimmed_source):
weekday_str = match.group(Constants.WEEKDAY_GROUP_NAME)
value = DateUtils.next(
reference, self.config.day_of_week.get(weekday_str))
result.timex = DateTimeFormatUtil.luis_date_from_datetime(value)
result.future_value = value
result.past_value = value
result.success = True
return result
# handle "this Friday"
match = regex.match(self.config.this_regex, trimmed_source)
if match and match.start() == 0 and len(match.group()) == len(trimmed_source):
weekday_str = match.group(Constants.WEEKDAY_GROUP_NAME)
value = DateUtils.this(
reference, self.config.day_of_week.get(weekday_str))
result.timex = DateTimeFormatUtil.luis_date_from_datetime(value)
result.future_value = value
result.past_value = value
result.success = True
return result
# handle "last Friday", "last mon"
match = regex.match(self.config.last_regex, trimmed_source)
if match and match.start() == 0 and len(match.group()) == len(trimmed_source):
weekday_str = match.group(Constants.WEEKDAY_GROUP_NAME)
value = DateUtils.last(
reference, self.config.day_of_week.get(weekday_str))
result.timex = DateTimeFormatUtil.luis_date_from_datetime(value)
result.future_value = value
result.past_value = value
result.success = True
return result
# handle "Friday"
match = regex.match(self.config.week_day_regex, trimmed_source)
if match and match.start() == 0 and len(match.group()) == len(trimmed_source):
weekday_str = match.group(Constants.WEEKDAY_GROUP_NAME)
weekday = self.config.day_of_week.get(weekday_str)
value = DateUtils.this(reference, weekday)
if weekday < int(DayOfWeek.MONDAY):
weekday = int(DayOfWeek.SUNDAY)
if weekday < reference.isoweekday():
value = DateUtils.next(reference, weekday)
result.timex = 'XXXX-WXX-' + str(weekday)
future_date = value
past_date = value
if future_date < reference:
future_date += timedelta(weeks=1)
if past_date >= reference:
past_date -= timedelta(weeks=1)
result.future_value = DateUtils.safe_create_from_min_value(future_date.year, future_date.month, future_date.day)
result.past_value = DateUtils.safe_create_from_min_value(past_date.year, past_date.month, past_date.day)
result.success = True
return result
# handle "for the 27th."
match = regex.match(self.config.for_the_regex, trimmed_source)
if match:
day_str = match.group(Constants.DAY_OF_MONTH)
er = ExtractResult.get_from_text(day_str)
day = int(self.config.number_parser.parse(er).value)
month = reference.month
year = reference.year
result.timex = DateTimeFormatUtil.luis_date(-1, -1, day)
date = datetime(year, month, day)
result.future_value = date
result.past_value = date
result.success = True
return result
# handling cases like 'Thursday the 21st', which both 'Thursday' and '21st' refer to a same date
match = regex.match(
self.config.week_day_and_day_of_month_regex, trimmed_source)
if match:
day_str = match.group(Constants.DAY_OF_MONTH)
er = ExtractResult.get_from_text(day_str)
day = int(self.config.number_parser.parse(er).value)
month = reference.month
year = reference.year
# the validity of the phrase is guaranteed in the Date Extractor
result.timex = DateTimeFormatUtil.luis_date(year, month, day)
date = datetime(year, month, day)
result.future_value = date
result.past_value = date
result.success = True
return result
return result