From 5929cd0d1b02c34d5bf041363ad3b059b929b524 Mon Sep 17 00:00:00 2001 From: gezimbll Date: Thu, 8 May 2025 15:24:43 +0200 Subject: [PATCH] added optional layout parameter for *localtime dataconverter --- utils/dataconverter.go | 29 +++++++++++++++++++++-------- utils/dataconverter_test.go | 7 +++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/utils/dataconverter.go b/utils/dataconverter.go index 9fe55cd91..7402575ce 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -127,11 +127,11 @@ func NewDataConverter(params string) (conv DataConverter, err error) { return NewTimeStringConverter(layout), nil case strings.HasPrefix(params, MetaLocalTime): - timezone := "Local" + var paramsStr string if len(params) > len(MetaLocalTime) { - timezone = params[len(MetaLocalTime)+1:] + paramsStr = params[len(MetaLocalTime)+1:] } - return NewLocalTimeConverter(timezone) + return NewLocalTimeConverter(paramsStr) case strings.HasPrefix(params, MetaRandom): if len(params) == len(MetaRandom) { // no extra params, defaults implied return NewRandomConverter(EmptyString) @@ -825,15 +825,29 @@ func (mS *DurationMinutesConverter) Convert(in any) ( } type LocalTimeConverter struct { - loc *time.Location + loc *time.Location + layout string } -func NewLocalTimeConverter(locStr string) (DataConverter, error) { +func NewLocalTimeConverter(params string) (DataConverter, error) { + locStr := "Local" + layout := time.DateTime + if len(params) != 0 { + values := strings.SplitN(params, InInFieldSep, 2) + if values[0] != EmptyString { + locStr = values[0] + } + if len(values) > 1 { + if values[1] != EmptyString { + layout = values[1] + } + } + } loc, err := time.LoadLocation(locStr) if err != nil { return nil, err } - return LocalTimeConverter{loc: loc}, nil + return LocalTimeConverter{loc: loc, layout: layout}, nil } func (lt LocalTimeConverter) Convert(in any) (out any, err error) { var tm time.Time @@ -849,6 +863,5 @@ func (lt LocalTimeConverter) Convert(in any) (out any, err error) { return nil, fmt.Errorf("*localtime converter: unsupported input") } tm = tm.In(lt.loc) - return tm.Format(time.DateTime), nil - + return tm.Format(lt.layout), nil } diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go index ea6635dfd..ba60e2b9a 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -2003,6 +2003,10 @@ func TestDurationMinutesConverter(t *testing.T) { } func TestLocalTimeDurationConverter(t *testing.T) { + loadTimelocation := func(tzName string, year int, month time.Month, day, hour, min, sec, nsec int) time.Time { + loc, _ := time.LoadLocation(tzName) + return time.Date(year, month, day, hour, min, sec, nsec, loc) + } testCases := []struct { name string input any @@ -2014,6 +2018,9 @@ func TestLocalTimeDurationConverter(t *testing.T) { {name: "Convert to UTC timezone", input: "2025-05-07T16:25:08+02:00", params: "*localtime:UTC", expectValue: "2025-05-07 14:25:08"}, {name: "Convert to UTC+01:00 timezone", input: "2025-05-07T14:25:08Z", params: "*localtime:Europe/Dublin", expectValue: "2025-05-07 15:25:08"}, {name: "Convert to UTC+03:00 timezone", input: time.Date(2025, 5, 5, 15, 5, 0, 0, time.UTC), params: "*localtime:Europe/Istanbul", expectValue: "2025-05-05 18:05:00"}, + {name: "Convert to UTC+03:00 timezone", input: "2025-05-08T10:07:08Z", params: "*localtime:Europe/Dublin:02/01/2006 15:04:05", expectValue: "08/05/2025 11:07:08"}, + {name: "Convert string UTC-07:00", input: "2025-03-08T23:50:00-07:00", params: "*localtime:Europe/Paris:15:04:05 02/01/2006", expectValue: "07:50:00 09/03/2025"}, + {name: "Convert time.Time from Asia/Dubai", input: loadTimelocation("Asia/Dubai", 2025, time.November, 20, 22, 15, 0, 0), params: "*localtime:Australia/Sydney:Jan 2, 2006 at 3:04pm (MST)", expectValue: "Nov 21, 2025 at 5:15am (AEDT)"}, } for _, tc := range testCases {