From 5840f5ef1981efed6b6f06f7806888d7885ab121 Mon Sep 17 00:00:00 2001 From: Song Gao Date: Fri, 14 Jun 2024 10:34:46 +0800 Subject: [PATCH] feat: support multiple S in format layout (#2917) Signed-off-by: yisaer --- pkg/cast/time.go | 22 ++++++++++------------ pkg/cast/time_test.go | 8 ++++++++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pkg/cast/time.go b/pkg/cast/time.go index f5ded6ece5..e4a1fae673 100644 --- a/pkg/cast/time.go +++ b/pkg/cast/time.go @@ -15,6 +15,7 @@ package cast import ( + "bytes" "fmt" "time" @@ -299,22 +300,19 @@ func convertFormat(f string) (string, error) { out += "05" } - case 'S': // S SS SSS - j := 1 - for ; i+j < lenFormat && j <= 3; j++ { - if formatRune[i+j] != r { + case 'S': // S SS SSS.... + j := 0 + for ; i+j < lenFormat; j++ { + if formatRune[i+j] != 'S' { break } } - i = i + j - 1 - switch j { - case 1: // S - out += ".0" - case 2: // SS - out += ".00" - case 3: // SSS - out += ".000" + b := bytes.NewBufferString(".") + for x := 0; x < j; x++ { + b.WriteString("0") } + out += b.String() + i = i + j - 1 case 'z': // z out += "MST" case 'Z': // Z diff --git a/pkg/cast/time_test.go b/pkg/cast/time_test.go index fd83ddd5f3..1bd6995d5e 100644 --- a/pkg/cast/time_test.go +++ b/pkg/cast/time_test.go @@ -279,4 +279,12 @@ func TestConvertFormat(t *testing.T) { s, err = convertFormat("\\") require.Error(t, err) + + s, err = convertFormat("yyyy-MM-dd HH:mm:ssSSSSSSSXX") + require.NoError(t, err) + require.Equal(t, "2006-01-02 15:04:05.0000000-0700", s) + + d, err := time.Parse("2006-01-02 15:04:05.0000000-0700", `2024-06-10 05:54:39.6574979-0700`) + require.NoError(t, err) + require.Equal(t, int64(1718024079657497900), d.UnixNano()) }