// merge a Date entity and a Time entity
        private DateTimeResolutionResult MergeDateAndTime(string text, DateObject referenceTime)
        {
            var ret           = new DateTimeResolutionResult();
            var matchAgoLater = this.config.AgoLaterRegex.Match(text);

            // cases with ago or later are processed in ParserDurationWithAgoAndLater
            if (matchAgoLater.Success)
            {
                return(ret);
            }

            var er1 = this.config.DateExtractor.Extract(text, referenceTime);

            if (er1.Count == 0)
            {
                return(ret);
            }

            var er2 = this.config.TimeExtractor.Extract(text, referenceTime);

            if (er2.Count == 0)
            {
                return(ret);
            }

            // TODO: Add reference time
            var pr1 = this.config.DateParser.Parse(er1[0], referenceTime.Date);
            var pr2 = this.config.TimeParser.Parse(er2[0], referenceTime);

            if (pr1.Value == null || pr2.Value == null)
            {
                return(ret);
            }

            var futureDate = (DateObject)((DateTimeResolutionResult)pr1.Value).FutureValue;
            var pastDate   = (DateObject)((DateTimeResolutionResult)pr1.Value).PastValue;
            var time       = (DateObject)((DateTimeResolutionResult)pr2.Value).FutureValue;

            // handle cases with time like 25時 which resolve to the next day
            var timexHour = TimexUtility.ParseHourFromTimeTimex(pr2.TimexStr);

            if (timexHour > Constants.DayHourCount)
            {
                futureDate = futureDate.AddDays(1);
                pastDate   = pastDate.AddDays(1);
            }

            var hour = time.Hour;
            var min  = time.Minute;
            var sec  = time.Second;

            // handle morning, afternoon
            if (this.config.SimplePmRegex.IsMatch(text) && hour < Constants.HalfDayHourCount)
            {
                hour += Constants.HalfDayHourCount;
            }
            else if (this.config.SimpleAmRegex.IsMatch(text) && hour >= Constants.HalfDayHourCount)
            {
                hour -= Constants.HalfDayHourCount;
            }

            var timeStr = pr2.TimexStr;

            if (timeStr.EndsWith(Constants.Comment_AmPm, StringComparison.Ordinal))
            {
                timeStr = timeStr.Substring(0, timeStr.Length - 4);
            }

            ret.Timex = pr1.TimexStr + timeStr;

            var val = (DateTimeResolutionResult)pr2.Value;

            if (hour <= Constants.HalfDayHourCount && !this.config.SimplePmRegex.IsMatch(text) && !this.config.SimpleAmRegex.IsMatch(text) &&
                !string.IsNullOrEmpty(val.Comment))
            {
                // ret.Timex += "ampm";
                ret.Comment = Constants.Comment_AmPm;
            }

            ret.FutureValue = DateObject.MinValue.SafeCreateFromValue(futureDate.Year, futureDate.Month, futureDate.Day, hour, min, sec);
            ret.PastValue   = DateObject.MinValue.SafeCreateFromValue(pastDate.Year, pastDate.Month, pastDate.Day, hour, min, sec);
            ret.Success     = true;

            return(ret);
        }