// Get year in integer from field, must be able to convert to date // // yy() => 15, true // assuming it is 2015 // yy("2014-03-01") => 14, true // func Yy(ctx expr.EvalContext, items ...value.Value) (value.IntValue, bool) { yy := 0 if len(items) == 0 { if !ctx.Ts().IsZero() { yy = ctx.Ts().Year() } else { // Do we want to use Now()? } } else if len(items) == 1 { //u.Debugf("has 1 items? %#v", items[0].Rv()) dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.NewIntValue(0), false } //u.Debugf("v=%v %v", dateStr, items[0].Rv()) if t, err := dateparse.ParseAny(dateStr); err != nil { return value.NewIntValue(0), false } else { yy = t.Year() } } else { return value.NewIntValue(0), false } if yy >= 2000 { yy = yy - 2000 } else if yy >= 1900 { yy = yy - 1900 } //u.Debugf("yy = %v", yy) return value.NewIntValue(int64(yy)), true }
// Get year in integer from date func Yy(ctx expr.EvalContext, items ...value.Value) (value.IntValue, bool) { yy := 0 if len(items) == 0 { if !ctx.Ts().IsZero() { yy = ctx.Ts().Year() } } else if len(items) == 1 { dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.NewIntValue(0), false } //u.Infof("v=%v %v ", v, item.Rv()) if t, err := dateparse.ParseAny(dateStr); err != nil { return value.NewIntValue(0), false } else { yy = t.Year() } } else { return value.NewIntValue(0), false } if yy >= 2000 { yy = yy - 2000 } else if yy >= 1900 { yy = yy - 1900 } //u.Infof("%v yy = %v", item, yy) return value.NewIntValue(int64(yy)), true }
// Get current time of Message (message time stamp) or else choose current // server time if none is available in message context // func Now(ctx expr.EvalContext, items ...value.Value) (value.TimeValue, bool) { if ctx != nil && !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewTimeValue(t), true } return value.NewTimeValue(time.Now().In(time.UTC)), true }
func TimeExtractFunc(ctx expr.EvalContext, items ...value.Value) (value.StringValue, bool) { switch len(items) { case 0: // if we have no "items", return time associated with ctx // This is an alias of now() t := ctx.Ts() if !t.IsZero() { return value.NewStringValue(t.String()), true } return value.EmptyStringValue, false case 1: // if only 1 item, convert item to time dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.EmptyStringValue, false } t, err := dateparse.ParseAny(dateStr) if err != nil { return value.EmptyStringValue, false } return value.NewStringValue(t.String()), true case 2: // if we have 2 items, the first is the time string // and the second is the format string. // Use leekchan/timeutil package dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.EmptyStringValue, false } formatStr, ok := value.ToString(items[1].Rv()) if !ok { return value.EmptyStringValue, false } t, err := dateparse.ParseAny(dateStr) if err != nil { return value.EmptyStringValue, false } formatted := timeutil.Strftime(&t, formatStr) return value.NewStringValue(formatted), true default: return value.EmptyStringValue, false } }
// hour of day [0-23] func HourOfDay(ctx expr.EvalContext, items ...value.Value) (value.IntValue, bool) { if len(items) == 0 { if !ctx.Ts().IsZero() { return value.NewIntValue(int64(ctx.Ts().Hour())), true } } else if len(items) == 1 { dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.NewIntValue(0), false } //u.Infof("v=%v %v ", v, items[0].Rv()) if t, err := dateparse.ParseAny(dateStr); err == nil { return value.NewIntValue(int64(t.Hour())), true } } return value.NewIntValue(0), false }
// Get yymm in 4 digits from argument if supplied, else uses message context ts // func YyMm(ctx expr.EvalContext, items ...value.Value) (value.StringValue, bool) { if len(items) == 0 { if !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewStringValue(t.Format(yymmTimeLayout)), true } } else if len(items) == 1 { dateStr, ok := value.ToString(items[0].Rv()) if !ok { return value.EmptyStringValue, false } //u.Infof("v=%v %v ", v, items[0].Rv()) if t, err := dateparse.ParseAny(dateStr); err == nil { return value.NewStringValue(t.Format(yymmTimeLayout)), true } } return value.EmptyStringValue, false }
// Get current time of Message (message time stamp) or else choose current // server time if none is available in message context // func Now(ctx expr.EvalContext, items ...value.Value) (value.TimeValue, bool) { u.Debugf("Now: %v", ctx.Ts()) if !ctx.Ts().IsZero() { t := ctx.Ts() return value.NewTimeValue(t), true } return value.NewTimeValue(time.Now().In(time.UTC)), true }