// Parse a regex match which includes 'day', 'month' and 'year' (optional) group private DateTimeResolutionResult Match2Date(Match match, DateObject referenceDate, string relativeStr) { var ret = new DateTimeResolutionResult(); int month = 0, day = 0, year = 0; var monthStr = match.Groups["month"].Value; var dayStr = match.Groups["day"].Value; var weekdayStr = match.Groups["weekday"].Value; var yearStr = match.Groups["year"].Value; var writtenYear = match.Groups["fullyear"].Value; var ambiguousCentury = false; if (this.config.MonthOfYear.ContainsKey(monthStr) && this.config.DayOfMonth.ContainsKey(dayStr)) { month = this.config.MonthOfYear[monthStr]; day = this.config.DayOfMonth[dayStr]; if (!string.IsNullOrEmpty(writtenYear)) { year = this.config.DateExtractor.GetYearFromText(match); } else if (!string.IsNullOrEmpty(yearStr)) { year = int.Parse(yearStr, CultureInfo.InvariantCulture); if (year < 100 && year >= Constants.MinTwoDigitYearPastNum) { year += Constants.BASE_YEAR_PAST_CENTURY; } else if (year >= 0 && year < Constants.MaxTwoDigitYearFutureNum) { year += Constants.BASE_YEAR_CURRENT_CENTURY; } else if (year >= Constants.MaxTwoDigitYearFutureNum && year < Constants.MinTwoDigitYearPastNum) { // Two-digit years in the range [30, 40) are ambiguos ambiguousCentury = true; } } } var noYear = false; if (year == 0) { year = referenceDate.Year; if (!string.IsNullOrEmpty(relativeStr)) { var swift = this.config.GetSwiftMonthOrYear(relativeStr); // @TODO Improve handling of next/last in particular cases "next friday 5/12" when the next friday is not 5/12. if (!string.IsNullOrEmpty(weekdayStr)) { swift = 0; } year += swift; } else { noYear = true; } ret.Timex = DateTimeFormatUtil.LuisDate(-1, month, day); } else { ret.Timex = DateTimeFormatUtil.LuisDate(year, month, day); } var futurePastDates = DateContext.GenerateDates(noYear, referenceDate, year, month, day); ret.FutureValue = futurePastDates.future; ret.PastValue = futurePastDates.past; ret.Success = true; // Ambiguous two-digit years are assigned values in both centuries (e.g. 35 -> 1935, 2035) if (ambiguousCentury) { ret.PastValue = futurePastDates.past.AddYears(Constants.BASE_YEAR_PAST_CENTURY); ret.FutureValue = futurePastDates.future.AddYears(Constants.BASE_YEAR_CURRENT_CENTURY); ret.Timex = TimexUtility.ModifyAmbiguousCenturyTimex(ret.Timex); } return(ret); }