diff --git a/doc/go1.20.html b/doc/go1.20.html
index 324d59ed6e283..1fef45204ed56 100644
--- a/doc/go1.20.html
+++ b/doc/go1.20.html
@@ -1200,9 +1200,8 @@
Minor changes to the library
- The Time.MarshalJSON
and
- Time.UnmarshalJSON
methods
- are now more strict about adherence to RFC 3339.
+ The Time.MarshalJSON
method
+ is now more strict about adherence to RFC 3339.
diff --git a/src/time/format_rfc3339.go b/src/time/format_rfc3339.go
index a9c295df97e5b..1151666c3e42f 100644
--- a/src/time/format_rfc3339.go
+++ b/src/time/format_rfc3339.go
@@ -155,7 +155,8 @@ func parseRFC3339[bytes []byte | string](s bytes, local *Location) (Time, bool)
func parseStrictRFC3339(b []byte) (Time, error) {
t, ok := parseRFC3339(b, Local)
if !ok {
- if _, err := Parse(RFC3339, string(b)); err != nil {
+ t, err := Parse(RFC3339, string(b))
+ if err != nil {
return Time{}, err
}
@@ -164,6 +165,10 @@ func parseStrictRFC3339(b []byte) (Time, error) {
// See https://go.dev/issue/54580.
num2 := func(b []byte) byte { return 10*(b[0]-'0') + (b[1] - '0') }
switch {
+ // TODO(https://go.dev/issue/54580): Strict parsing is disabled for now.
+ // Enable this again with a GODEBUG opt-out.
+ case true:
+ return t, nil
case b[len("2006-01-02T")+1] == ':': // hour must be two digits
return Time{}, &ParseError{RFC3339, string(b), "15", string(b[len("2006-01-02T"):][:1]), ""}
case b[len("2006-01-02T15:04:05")] == ',': // sub-second separator must be a period
diff --git a/src/time/time_test.go b/src/time/time_test.go
index ddf77cccb4359..4221efec8872b 100644
--- a/src/time/time_test.go
+++ b/src/time/time_test.go
@@ -830,10 +830,10 @@ func TestUnmarshalInvalidTimes(t *testing.T) {
}{
{`{}`, "Time.UnmarshalJSON: input is not a JSON string"},
{`[]`, "Time.UnmarshalJSON: input is not a JSON string"},
- {`"2000-01-01T1:12:34Z"`, `parsing time "2000-01-01T1:12:34Z" as "2006-01-02T15:04:05Z07:00": cannot parse "1" as "15"`},
- {`"2000-01-01T00:00:00,000Z"`, `parsing time "2000-01-01T00:00:00,000Z" as "2006-01-02T15:04:05Z07:00": cannot parse "," as "."`},
- {`"2000-01-01T00:00:00+24:00"`, `parsing time "2000-01-01T00:00:00+24:00": timezone hour out of range`},
- {`"2000-01-01T00:00:00+00:60"`, `parsing time "2000-01-01T00:00:00+00:60": timezone minute out of range`},
+ {`"2000-01-01T1:12:34Z"`, ``},
+ {`"2000-01-01T00:00:00,000Z"`, ``},
+ {`"2000-01-01T00:00:00+24:00"`, ``},
+ {`"2000-01-01T00:00:00+00:60"`, ``},
{`"2000-01-01T00:00:00+123:45"`, `parsing time "2000-01-01T00:00:00+123:45" as "2006-01-02T15:04:05Z07:00": cannot parse "+123:45" as "Z07:00"`},
}
@@ -842,13 +842,13 @@ func TestUnmarshalInvalidTimes(t *testing.T) {
want := tt.want
err := json.Unmarshal([]byte(tt.in), &ts)
- if err == nil || err.Error() != want {
+ if fmt.Sprint(err) != want {
t.Errorf("Time.UnmarshalJSON(%s) = %v, want %v", tt.in, err, want)
}
if strings.HasPrefix(tt.in, `"`) && strings.HasSuffix(tt.in, `"`) {
err = ts.UnmarshalText([]byte(strings.Trim(tt.in, `"`)))
- if err == nil || err.Error() != want {
+ if fmt.Sprint(err) != want {
t.Errorf("Time.UnmarshalText(%s) = %v, want %v", tt.in, err, want)
}
}