public JapaneseDateParserConfiguration(JapaneseDateTimeParserConfiguration configuration) { config = configuration; integerExtractor = new IntegerExtractor(); durationExtractor = new JapaneseDurationExtractorConfiguration(); numberParser = new BaseCJKNumberParser(new JapaneseNumberParserConfiguration()); }
public JapaneseDateParserConfiguration(JapaneseDateTimeParserConfiguration configuration) { config = configuration; var numOptions = NumberOptions.None; if ((config.Options & DateTimeOptions.NoProtoCache) != 0) { numOptions = NumberOptions.NoProtoCache; } var numConfig = new BaseNumberOptionsConfiguration(config.Culture, numOptions); integerExtractor = new IntegerExtractor(); durationExtractor = new JapaneseDurationExtractorConfiguration(); numberParser = new BaseCJKNumberParser(new JapaneseNumberParserConfiguration(numConfig)); }
// match several other cases // including '今天', '后天', '十三日' protected DateTimeResolutionResult ParseImplicitDate(string text, DateObject referenceDate) { var ret = new DateTimeResolutionResult(); // handle "十二日" "明年这个月三日" "本月十一日" var match = JapaneseDateExtractorConfiguration.SpecialDate.MatchExact(text, trim: true); if (match.Success) { var yearStr = match.Groups["thisyear"].Value.ToLower(); var monthStr = match.Groups["thismonth"].Value.ToLower(); var dayStr = match.Groups["day"].Value.ToLower(); int month = referenceDate.Month, year = referenceDate.Year; var day = this.config.DayOfMonth[dayStr]; bool hasYear = false, hasMonth = false; if (!string.IsNullOrEmpty(monthStr)) { hasMonth = true; if (JapaneseDateExtractorConfiguration.NextRe.Match(monthStr).Success) { month++; if (month == 13) { month = 1; year++; } } else if (JapaneseDateExtractorConfiguration.LastRe.Match(monthStr).Success) { month--; if (month == 0) { month = 12; year--; } } if (!string.IsNullOrEmpty(yearStr)) { hasYear = true; if (JapaneseDateExtractorConfiguration.NextRe.Match(yearStr).Success) { ++year; } else if (JapaneseDateExtractorConfiguration.LastRe.Match(yearStr).Success) { --year; } } } ret.Timex = DateTimeFormatUtil.LuisDate(hasYear ? year : -1, hasMonth ? month : -1, day); DateObject futureDate, pastDate; if (day > MonthMaxDays[month - 1]) { futureDate = DateObject.MinValue.SafeCreateFromValue(year, month + 1, day); pastDate = DateObject.MinValue.SafeCreateFromValue(year, month - 1, day); } else { futureDate = DateObject.MinValue.SafeCreateFromValue(year, month, day); pastDate = DateObject.MinValue.SafeCreateFromValue(year, month, day); if (!hasMonth) { if (futureDate < referenceDate) { futureDate = futureDate.AddMonths(1); } if (pastDate >= referenceDate) { pastDate = pastDate.AddMonths(-1); } } else if (!hasYear) { if (futureDate < referenceDate) { futureDate = futureDate.AddYears(1); } if (pastDate >= referenceDate) { pastDate = pastDate.AddYears(-1); } } } ret.FutureValue = futureDate; ret.PastValue = pastDate; ret.Success = true; return(ret); } // handle cases like "昨日", "明日", "大后天" match = JapaneseDateExtractorConfiguration.SpecialDayRegex.MatchExact(text, trim: true); if (match.Success) { var value = referenceDate.AddDays(JapaneseDateTimeParserConfiguration.GetSwiftDay(match.Value)); ret.Timex = DateTimeFormatUtil.LuisDate(value); ret.FutureValue = ret.PastValue = value; ret.Success = true; return(ret); } match = JapaneseDateExtractorConfiguration.SpecialMonthRegex.MatchExact(text, trim: true); if (match.Success) { var value = referenceDate.AddMonths(JapaneseDateTimeParserConfiguration.GetSwiftMonth(match.Value)); ret.Timex = DateTimeFormatUtil.LuisDate(value); ret.FutureValue = ret.PastValue = value; ret.Success = true; return(ret); } match = JapaneseDateExtractorConfiguration.SpecialYearRegex.MatchExact(text, trim: true); if (match.Success) { var value = referenceDate.AddYears(JapaneseDateTimeParserConfiguration.GetSwiftYear(match.Value)); ret.Timex = DateTimeFormatUtil.LuisDate(value); ret.FutureValue = ret.PastValue = value; ret.Success = true; return(ret); } if (!ret.Success) { ret = MatchThisWeekday(text, referenceDate); } if (!ret.Success) { ret = MatchNextWeekday(text, referenceDate); } if (!ret.Success) { ret = MatchLastWeekday(text, referenceDate); } if (!ret.Success) { ret = MatchWeekdayAlone(text, referenceDate); } return(ret); }