func parseAbsoluteTime()

in query/common/time_filter.go [149:238]


func parseAbsoluteTime(dateExpr, timeExpr string, location *time.Location) (start, end time.Time, unit string, err error) {
	var year, quarter, hour, minute int
	month, day := time.January, 1

	segments := strings.Split(dateExpr, "-")
	if len(segments) > 3 {
		err = utils.StackError(nil, "Unknown time expression: %s %s", dateExpr, timeExpr)
		return
	}

	year, err = strconv.Atoi(segments[0])
	if err != nil {
		err = utils.StackError(err, "failed to parse %s as year", segments[0])
		return
	}
	unit = "y"

	if len(segments) >= 2 {
		if segments[1][0] == 'Q' {
			quarter, err = strconv.Atoi(segments[1][1:])
			if err != nil {
				err = utils.StackError(err, "failed to parse %s as quarter", segments[1][1:])
				return
			}
			if len(segments) == 3 {
				err = utils.StackError(nil, "Unknown time expression: %s %s", dateExpr, timeExpr)
				return
			}
			month = time.January + time.Month(quarter-1)*3
			unit = "q"
		} else {
			var monthNumber int
			monthNumber, err = strconv.Atoi(segments[1])
			if err != nil {
				err = utils.StackError(err, "failed to parse %s as month", segments[1])
				return
			}
			month = time.Month(monthNumber)
			unit = "M"
		}
	}

	if len(segments) == 3 {
		day, err = strconv.Atoi(segments[2])
		if err != nil {
			err = utils.StackError(err, "failed to parse %s as day", segments[2])
			return
		}
		unit = "d"
	} else if timeExpr != "" {
		err = utils.StackError(nil, "Unknown time expression: %s %s", dateExpr, timeExpr)
		return
	}

	if timeExpr != "" {
		segments = strings.Split(timeExpr, ":")
		if len(segments) > 2 {
			err = utils.StackError(nil, "Unknown time expression: %s %s", dateExpr, timeExpr)
			return
		}

		hour, err = strconv.Atoi(segments[0])
		if err != nil {
			err = utils.StackError(err, "failed to parse %s as hour", segments[0])
			return
		}
		unit = "h"

		if len(segments) == 2 {
			minute, err = strconv.Atoi(segments[1])
			if err != nil {
				err = utils.StackError(err, "failed to parse %s as minute", segments[1])
				return
			}
			unit = "m"

			// Temporary hack until summary switch to use relative time expression.
			if minute%15 == 0 {
				unit = "15m"
			}
		}
	}

	t := time.Date(year, month, day, hour, minute, 0, 0, location)
	if hour == 0 {
		t = adjustMidnight(t)
	}
	start, end, err = applyTimeOffset(t, 0, unit)
	return
}