@@ -268,3 +268,51 @@ func DateTimeStr() ParserFn {
268268 ChangeClassName (clsz .DateTimeStr ),
269269 )
270270}
271+
272+ // Parse the ISO 8601 time string.
273+ // (hh:mm , ... , hh:mm:ss.fffffffff)
274+ func TimeStr () ParserFn {
275+ return Trans (
276+ FlatGroup (
277+ CharRange (RuneRange {Start : '0' , End : '2' }),
278+ CharRange (RuneRange {Start : '0' , End : '9' }),
279+ Seq (":" ),
280+ CharRange (RuneRange {Start : '0' , End : '5' }),
281+ CharRange (RuneRange {Start : '0' , End : '9' }),
282+ First (
283+ FlatGroup (
284+ Seq (":" ),
285+ CharRange (RuneRange {Start : '0' , End : '6' }),
286+ CharRange (RuneRange {Start : '0' , End : '9' }),
287+ First (
288+ FlatGroup (
289+ Seq ("." ),
290+ Trans (
291+ Repeat (Times {Min : 1 , Max : 9 }, // 3: milli, 6: micro, 9: nano
292+ CharRange (RuneRange {Start : '0' , End : '9' }),
293+ ),
294+ Concat ,
295+ func (ctx ParserContext , asts AstSlice ) (AstSlice , error ) {
296+ return AstSlice {{
297+ Type : AstType_String ,
298+ Value : (asts [len (asts )- 1 ].Value .(string ) + "000000000" )[0 :9 ],
299+ }}, nil
300+ },
301+ ),
302+ ),
303+ Zero (Ast {
304+ Type : AstType_String ,
305+ Value : ".000000000" ,
306+ }),
307+ ),
308+ ),
309+ Zero (Ast {
310+ Type : AstType_String ,
311+ Value : ":00.000000000" ,
312+ }),
313+ ),
314+ ),
315+ Concat ,
316+ ChangeClassName (clsz .TimeStr ),
317+ )
318+ }
0 commit comments