@@ -162,7 +162,7 @@ func parseLocalDateTime(b []byte) (LocalDateTime, []byte, error) {
162162
163163 const localDateTimeByteMinLen = 11
164164 if len (b ) < localDateTimeByteMinLen {
165- return dt , nil , unstable .NewParserError (b , "local datetimes are expected to have the format YYYY-MM-DDTHH:MM:SS[.NNNNNNNNN]" )
165+ return dt , nil , unstable .NewParserError (b , "local datetimes are expected to have the format YYYY-MM-DDTHH:MM[ :SS[.NNNNNNNNN] ]" )
166166 }
167167
168168 date , err := parseLocalDate (b [:10 ])
@@ -194,10 +194,10 @@ func parseLocalTime(b []byte) (LocalTime, []byte, error) {
194194 t LocalTime
195195 )
196196
197- // check if b matches to have expected format HH:MM:SS[.NNNNNN]
198- const localTimeByteLen = 8
199- if len (b ) < localTimeByteLen {
200- return t , nil , unstable .NewParserError (b , "times are expected to have the format HH:MM:SS[.NNNNNN]" )
197+ // check if b matches to have expected format HH:MM[ :SS[.NNNNNN] ]
198+ const localTimeByteMinLen = 5
199+ if len (b ) < localTimeByteMinLen {
200+ return t , nil , unstable .NewParserError (b , "times are expected to have the format HH:MM[ :SS[.NNNNNN] ]" )
201201 }
202202
203203 var err error
@@ -221,22 +221,33 @@ func parseLocalTime(b []byte) (LocalTime, []byte, error) {
221221 if t .Minute > 59 {
222222 return t , nil , unstable .NewParserError (b [3 :5 ], "minutes cannot be greater 59" )
223223 }
224- if b [5 ] != ':' {
225- return t , nil , unstable .NewParserError (b [5 :6 ], "expecting colon between minutes and seconds" )
226- }
227224
228- t .Second , err = parseDecimalDigits (b [6 :8 ])
229- if err != nil {
230- return t , nil , err
231- }
225+ b = b [5 :]
232226
233- if t .Second > 59 {
234- return t , nil , unstable .NewParserError (b [6 :8 ], "seconds cannot be greater than 59" )
235- }
227+ // Seconds are optional (TOML v1.1.0). Fractional seconds may only appear
228+ // when seconds are present:
229+ // partial-time = time-hour ":" time-minute [ ":" time-second [ time-secfrac ] ]
230+ secondsPresent := false
231+
232+ if len (b ) >= 1 && b [0 ] == ':' {
233+ if len (b ) < 3 {
234+ return t , nil , unstable .NewParserError (b , "incomplete seconds" )
235+ }
236236
237- b = b [8 :]
237+ t .Second , err = parseDecimalDigits (b [1 :3 ])
238+ if err != nil {
239+ return t , nil , err
240+ }
241+
242+ if t .Second > 59 {
243+ return t , nil , unstable .NewParserError (b [1 :3 ], "seconds cannot be greater than 59" )
244+ }
245+
246+ b = b [3 :]
247+ secondsPresent = true
248+ }
238249
239- if len (b ) >= 1 && b [0 ] == '.' {
250+ if secondsPresent && len (b ) >= 1 && b [0 ] == '.' {
240251 frac := 0
241252 precision := 0
242253 digits := 0
0 commit comments