public TimeResult GetShortLeft(string text) { string des = null; if (Regex.IsMatch(text, DayDescRegex)) { des = text.Substring(0, text.Length - 1); } var hour = MatchToValue(text.Substring(text.Length - 1, 1)); var timeResult = new TimeResult { Hour = hour, Minute = -1, Second = -1, }; AddDesc(timeResult, des); return(timeResult); }
public static string BuildTimex(TimeResult timeResult) { var build = new StringBuilder("T"); if (timeResult.Hour >= 0) { build.Append(timeResult.Hour.ToString("D2")); } if (timeResult.Minute >= 0) { build.Append(":" + timeResult.Minute.ToString("D2")); } if (timeResult.Second >= 0) { build.Append(":" + timeResult.Second.ToString("D2")); } return(build.ToString()); }
public DateTimeResolutionResult PackTimeResult(DateTimeExtra <TimeType> extra, TimeResult timeResult, DateObject referenceTime) { // Find if there is a description var noDesc = true; var dayDesc = extra.NamedEntity["daydesc"]?.Value; if (!string.IsNullOrEmpty(dayDesc)) { AddDesc(timeResult, dayDesc); noDesc = false; } // Hours > 24 (e.g. 25時 which resolves to the next day) are kept unnormalized in the timex // to avoid ambiguity in other entities. For example, "on the 30th at 25" is resolved to // "XXXX-XX-30T25" because with "XXXX-XX-30+1T01" it is not known if the day should be "31" or "01". int hour = timeResult.Hour > 0 && timeResult.Hour != Constants.DayHourCount ? timeResult.Hour : 0, min = timeResult.Minute > 0 ? timeResult.Minute : 0, second = timeResult.Second > 0 ? timeResult.Second : 0; var dateTimeResult = new DateTimeResolutionResult(); var build = new StringBuilder("T"); if (timeResult.Hour >= 0) { build.Append(hour.ToString("D2", CultureInfo.InvariantCulture)); } if (timeResult.Minute >= 0) { build.Append(":" + min.ToString("D2", CultureInfo.InvariantCulture)); } if (timeResult.Second >= 0) { if (timeResult.Minute < 0) { build.Append(":" + min.ToString("D2", CultureInfo.InvariantCulture)); } build.Append(":" + second.ToString("D2", CultureInfo.InvariantCulture)); } // handle cases with time like 25時 (the hour is normalized in the past/future values) if (timeResult.Hour > Constants.DayHourCount) { hour = timeResult.Hour - Constants.DayHourCount; referenceTime = referenceTime.AddDays(1); if (noDesc) { dateTimeResult.Comment = Constants.Comment_Am; noDesc = false; } } if (noDesc && hour <= Constants.HalfDayHourCount) { // build.Append("ampm"); dateTimeResult.Comment = Constants.Comment_AmPm; } dateTimeResult.Timex = build.ToString(); int day = referenceTime.Day, month = referenceTime.Month, year = referenceTime.Year; dateTimeResult.FutureValue = dateTimeResult.PastValue = DateObject.MinValue.SafeCreateFromValue(year, month, day, hour, min, second); dateTimeResult.Success = true; return(dateTimeResult); }
public DateTimeResolutionResult PackTimeResult(DateTimeExtra <TimeType> extra, TimeResult timeResult, DateObject referenceTime) { // Find if there is a description var noDesc = true; var dayDesc = extra.NamedEntity["daydesc"]?.Value; if (!string.IsNullOrEmpty(dayDesc)) { AddDesc(timeResult, dayDesc); noDesc = false; } int hour = timeResult.Hour > 0 ? timeResult.Hour : 0, min = timeResult.Minute > 0 ? timeResult.Minute : 0, second = timeResult.Second > 0 ? timeResult.Second : 0, day = referenceTime.Day, month = referenceTime.Month, year = referenceTime.Year; var dateTimeResult = new DateTimeResolutionResult(); var build = new StringBuilder("T"); if (timeResult.Hour >= 0) { build.Append(timeResult.Hour.ToString("D2")); } if (timeResult.Minute >= 0) { build.Append(":" + timeResult.Minute.ToString("D2")); } if (timeResult.Second >= 0) { build.Append(":" + timeResult.Second.ToString("D2")); } if (noDesc) { // build.Append("ampm"); dateTimeResult.Comment = Constants.Comment_AmPm; } dateTimeResult.Timex = build.ToString(); if (hour == 24) { hour = 0; } dateTimeResult.FutureValue = dateTimeResult.PastValue = DateObject.MinValue.SafeCreateFromValue(year, month, day, hour, min, second); dateTimeResult.Success = true; return(dateTimeResult); }
public static DateTimeResolutionResult Handle(IDateTimeParser timeParser, DateTimeExtra <PeriodType> extra, DateObject refTime, TimeFunctions timeFunc) { // Left is a time var left = extra.NamedEntity["left"]; TimeResult leftResult, rightResult = null; // 下午四点十分到五点十分 if (extra.Type == PeriodType.FullTime) { var leftExtract = new ExtractResult { Start = left.Index, Length = left.Length, Text = left.Value, Type = Constants.SYS_DATETIME_TIME, }; leftResult = timeParser.Parse(leftExtract, refTime).Data as TimeResult; } else { // 下午四到五点 leftResult = timeFunc.GetShortLeft(left.Value); } // Right is a time var right = extra.NamedEntity["right"]; var rightExtract = new ExtractResult { Start = right.Index, Length = right.Length, Text = right.Value, Type = Constants.SYS_DATETIME_TIME, }; rightResult = timeParser.Parse(rightExtract, refTime).Data as TimeResult; var ret = new DateTimeResolutionResult() { Success = true, }; // the right side doesn't contain desc while the left side does if (rightResult.LowBound == -1 && leftResult.LowBound != -1 && rightResult.Hour <= leftResult.LowBound) { rightResult.Hour += Constants.HalfDayHourCount; } int day = refTime.Day, month = refTime.Month, year = refTime.Year; // determine if the right side time is smaller than the left side, if yes, add one day int hour = leftResult.Hour > 0 ? leftResult.Hour : 0, min = leftResult.Minute > 0 ? leftResult.Minute : 0, second = leftResult.Second > 0 ? leftResult.Second : 0; var leftTime = DateObject.MinValue.SafeCreateFromValue(year, month, day, hour, min, second); hour = rightResult.Hour > 0 ? rightResult.Hour : 0; min = rightResult.Minute > 0 ? rightResult.Minute : 0; second = rightResult.Second > 0 ? rightResult.Second : 0; var rightTime = DateObject.MinValue.SafeCreateFromValue(year, month, day, hour, min, second); if (rightTime.Hour < leftTime.Hour) { rightTime = rightTime.AddDays(1); } ret.FutureValue = ret.PastValue = new Tuple <DateObject, DateObject>(leftTime, rightTime); var leftTimex = BuildTimex(leftResult); var rightTimex = BuildTimex(rightResult); ret.Timex = $"({leftTimex},{rightTimex},{BuildSpan(leftResult, rightResult)})"; return(ret); }
public static string BuildSpan(TimeResult left, TimeResult right) { if (right.Minute == -1) { right.Minute = 0; } if (right.Second == -1) { right.Second = 0; } if (left.Minute == -1) { left.Minute = 0; } if (left.Second == -1) { left.Second = 0; } var spanHour = right.Hour - left.Hour; var spanMinute = right.Minute - left.Minute; var spanSecond = right.Second - left.Second; if (spanSecond < 0) { spanSecond += 60; spanMinute -= 1; } if (spanMinute < 0) { spanMinute += 60; spanHour -= 1; } if (spanHour < 0) { spanHour += 24; } var spanTimex = new StringBuilder(); spanTimex.Append("PT"); if (spanHour > 0) { spanTimex.Append($"{spanHour}H"); } if (spanMinute != 0 && spanSecond == 0) { spanTimex.Append($"{spanMinute}M"); } else if (spanSecond != 0) { spanTimex.Append($"{spanMinute}M{spanSecond}S"); } return(spanTimex.ToString()); }