protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) { var date = new AbstractPeriod(); var direction = 0; // relative type switch (match.Groups[1].Value) { case "y": case "x": direction = 1; // "next" or "closest next" break; case "s": direction = -1; break; } // time period type switch (match.Groups[2].Value) { case "Y": date.Date = userDate.AddYears(direction); date.Fix(FixPeriod.Year); break; case "m": date.Date = userDate.AddMonths(direction); date.FixDownTo(FixPeriod.Month); break; case "w": date.Date = userDate.AddDays(direction * 7); date.FixDownTo(FixPeriod.Week); break; case "d": date.Date = userDate.AddDays(direction); date.FixDownTo(FixPeriod.Day); break; } // remove and insert data.ReplaceTokensByDates(match.Index, match.Length, date); return(true); }
protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) { var date = new AbstractPeriod(); // day of week var dayOfWeek = ParserUtils.FindIndex(data.Tokens[match.Groups[2].Index].Value, Keywords.DaysOfWeek()) + 1; var userDayOfWeek = (int)userDate.DayOfWeek; if (userDayOfWeek == 0) { userDayOfWeek = 7; // starts from Monday, not Sunday } var diff = dayOfWeek - userDayOfWeek; if (match.Groups[1].Success) { switch (match.Groups[1].Value) { case "y": // "closest next" if (diff < 0) { diff += 7; } date.Date = userDate.AddDays(diff); break; case "x": // "next" date.Date = userDate.AddDays(diff + 7); break; case "s": // "previous" date.Date = userDate.AddDays(diff - 7); break; case "u": // "current" date.Date = userDate.AddDays(diff); break; } date.FixDownTo(FixPeriod.Day); } else { date.Date = userDate.AddDays(diff); date.Fix(FixPeriod.Day); date.FixDayOfWeek = true; } // remove and insert data.ReplaceTokensByDates(match.Index, match.Length, date); return(true); }
protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) { if (!int.TryParse(match.Value, out var relativeDay)) { return(false); } relativeDay -= 4; // create date var date = new AbstractPeriod { Date = userDate.AddDays(relativeDay) }; date.FixDownTo(FixPeriod.Day); // remove and insert data.ReplaceTokensByDates(match.Index, match.Length, date); return(true); }
protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) { if (match.Groups[1].Success ^ match.Groups[4].Success) { // if "after" of "before", but not both and not neither var letters = match.Groups[2].Value.Select(s => s.ToString()).ToList(); var lastNumber = 1; var tokenIndex = match.Groups[2].Index; var direction = 1; // moving to the future if (match.Groups[4].Success && match.Groups[4].Value == "b") { direction = -1; // "before" } var date = new AbstractPeriod { SpanDirection = direction, }; // save current day to offser object var offset = new DateTimeOffset(userDate); letters.ForEach(l => { switch (l) { case "N": // "and", skip it break; case "0": // number, store it int.TryParse(data.Tokens[tokenIndex].Value, out lastNumber); break; case "Y": // year(s) offset = offset.AddYears(direction * lastNumber); date.FixDownTo(FixPeriod.Month); lastNumber = 1; break; case "m": // month(s) offset = offset.AddMonths(direction * lastNumber); date.FixDownTo(FixPeriod.Week); lastNumber = 1; break; case "w": // week(s) offset = offset.AddDays(7 * direction * lastNumber); date.FixDownTo(FixPeriod.Day); lastNumber = 1; break; case "d": // day(s) offset = offset.AddDays(direction * lastNumber); date.FixDownTo(FixPeriod.Day); lastNumber = 1; break; case "h": // hour(s) offset = offset.AddHours(direction * lastNumber); date.FixDownTo(FixPeriod.Time); lastNumber = 1; break; case "e": // minute(s) offset = offset.AddMinutes(direction * lastNumber); date.FixDownTo(FixPeriod.Time); break; } tokenIndex++; }); // set date date.Date = new DateTime(offset.DateTime.Year, offset.DateTime.Month, offset.DateTime.Day); if (date.IsFixed(FixPeriod.Time)) { date.Time = new TimeSpan(offset.DateTime.Hour, offset.DateTime.Minute, 0); } date.Span = offset - userDate; // remove and insert data.ReplaceTokensByDates(match.Index, match.Length, date); return(true); } return(false); }