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
}