]> Cypherpunks repositories - gostls13.git/commitdiff
time: don't get confused about day 31 when parsing 002
authorIan Lance Taylor <iant@golang.org>
Sun, 23 Feb 2020 16:04:13 +0000 (08:04 -0800)
committerIan Lance Taylor <iant@golang.org>
Sun, 23 Feb 2020 18:06:08 +0000 (18:06 +0000)
The 002 parsing code had a bug that mishandled day 31.

Fixes #37387

Change-Id: Ia5a492a4ddd09a4bc232ce9582aead42d5099bdd
Reviewed-on: https://go-review.googlesource.com/c/go/+/220637
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
src/time/format.go
src/time/format_test.go

index 9beb5d9a48fcbbd4d3f8c1f9f0021e207e38bb11..899b6a40b0a13c93a16875bd84e3f0c8fcaba323 100644 (file)
@@ -1112,7 +1112,7 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error)
                        return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year out of range"}
                }
                if m == 0 {
-                       m = yday/31 + 1
+                       m = (yday-1)/31 + 1
                        if int(daysBefore[m]) < yday {
                                m++
                        }
index 34990cdbc31fa3e0d319c8d0ae2094cef96fd2b4..a030242e6a8370dd2b69d2f7cb5977c54d5d2b45 100644 (file)
@@ -756,3 +756,17 @@ func TestParseMonthOutOfRange(t *testing.T) {
                }
        }
 }
+
+// Issue 37387.
+func TestParseYday(t *testing.T) {
+       t.Parallel()
+       for i := 1; i <= 365; i++ {
+               d := fmt.Sprintf("2020-%03d", i)
+               tm, err := Parse("2006-002", d)
+               if err != nil {
+                       t.Errorf("unexpected error for %s: %v", d, err)
+               } else if tm.Year() != 2020 || tm.YearDay() != i {
+                       t.Errorf("got year %d yearday %d, want %d %d", tm.Year(), tm.YearDay(), 2020, i)
+               }
+       }
+}