예제 #1
0
        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());
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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());
        }