From 4e9183cb14bf58011389c8a8c8ccaecd3ef50451 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Sun, 21 Aug 2022 02:36:24 -0700 Subject: [PATCH] time: fix Parse to ignore extra sub-nanosecond digits This modifies the code to match the comment such that the behavior truly is identical to stdSecond case. Also, it modifies the behavior to match the documented behavior where: Fractional seconds are truncated to nanosecond precision. Fixes #54567 Updates #48685 Change-Id: Ie64549e4372ab51624c105ad8ab4cc99b9b5a0b3 Reviewed-on: https://go-review.googlesource.com/c/go/+/425037 Run-TryBot: Joseph Tsai Reviewed-by: David Chase TryBot-Result: Gopher Robot Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor Auto-Submit: Joseph Tsai --- src/time/format.go | 2 +- src/time/format_test.go | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/time/format.go b/src/time/format.go index 80495c0266..ed2a0a8fc6 100644 --- a/src/time/format.go +++ b/src/time/format.go @@ -1278,7 +1278,7 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) // Take any number of digits, even more than asked for, // because it is what the stdSecond case would do. i := 0 - for i < 9 && i+1 < len(value) && '0' <= value[i+1] && value[i+1] <= '9' { + for i+1 < len(value) && '0' <= value[i+1] && value[i+1] <= '9' { i++ } nsec, rangeErrString, err = parseNanoseconds(value, 1+i) diff --git a/src/time/format_test.go b/src/time/format_test.go index fa8c846686..0e5b92440e 100644 --- a/src/time/format_test.go +++ b/src/time/format_test.go @@ -863,7 +863,7 @@ func TestFormatFractionalSecondSeparators(t *testing.T) { } } -// Issue 48685 +// Issue 48685 and 54567. func TestParseFractionalSecondsLongerThanNineDigits(t *testing.T) { tests := []struct { s string @@ -893,13 +893,15 @@ func TestParseFractionalSecondsLongerThanNineDigits(t *testing.T) { } for _, tt := range tests { - tm, err := Parse(RFC3339, tt.s) - if err != nil { - t.Errorf("Unexpected error: %v", err) - continue - } - if got := tm.Nanosecond(); got != tt.want { - t.Errorf("Parse(%q) = got %d, want %d", tt.s, got, tt.want) + for _, format := range []string{RFC3339, RFC3339Nano} { + tm, err := Parse(format, tt.s) + if err != nil { + t.Errorf("Parse(%q, %q) error: %v", format, tt.s, err) + continue + } + if got := tm.Nanosecond(); got != tt.want { + t.Errorf("Parse(%q, %q) = got %d, want %d", format, tt.s, got, tt.want) + } } } } -- 2.50.0