unmarshal: support lowercase 'T' and 'Z' in date-time parsing (#601)

RFC3399 allows for lowercase 't' and 'z' in date-time values.

Fixes #600
This commit is contained in:
Cameron Moore
2021-09-25 12:02:23 -05:00
committed by GitHub
parent ee9b902222
commit 476492a85c
3 changed files with 11 additions and 4 deletions
+2 -2
View File
@@ -75,7 +75,7 @@ func parseDateTime(b []byte) (time.Time, error) {
panic("date time should have a timezone")
}
if b[0] == 'Z' {
if b[0] == 'Z' || b[0] == 'z' {
b = b[1:]
zone = time.UTC
} else {
@@ -127,7 +127,7 @@ func parseLocalDateTime(b []byte) (LocalDateTime, []byte, error) {
dt.LocalDate = date
sep := b[10]
if sep != 'T' && sep != ' ' {
if sep != 'T' && sep != ' ' && sep != 't' {
return dt, nil, newDecodeError(b[10:11], "datetime separator is expected to be T or a space")
}
+2 -2
View File
@@ -887,9 +887,9 @@ byteLoop:
if i >= minOffsetOfTz {
hasTz = true
}
case c == 'T' || c == ':' || c == '.':
case c == 'T' || c == 't' || c == ':' || c == '.':
hasTime = true
case c == '+' || c == '-' || c == 'Z':
case c == '+' || c == '-' || c == 'Z' || c == 'z':
hasTz = true
case c == ' ':
if !seenSpace && i+1 < len(b) && isDigit(b[i+1]) {
+7
View File
@@ -1752,6 +1752,13 @@ func TestIssue585(t *testing.T) {
require.Error(t, err)
}
// Support lowercase 'T' and 'Z'
func TestIssue600(t *testing.T) {
var v interface{}
err := toml.Unmarshal([]byte(`a=1979-05-27t00:32:00z`), &v)
require.NoError(t, err)
}
//nolint:funlen
func TestUnmarshalDecodeErrors(t *testing.T) {
examples := []struct {