/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ package Ġaws . smithy . kotlin . runtime . time Ċ Ċ // Ġtimestamp Ġformat Ġparsers Ċ Ċ /** Ċ Ġ* ĠRepresents Ġthe Ġresult Ġof Ġparsing Ġa Ġdate Ġfrom Ġa Ġstring Ġin Ġsome Ġknown Ġformat Ġ( e . g . ĠISO - 8 6 0 1 , ĠRFC - 8 2 2 , Ġetc ) Ċ Ġ*/ Ċ private Ġdata Ġclass ĠParsed Date ( val Ġyear : ĠInt , Ġval Ġmonth : ĠInt , Ġval Ġday : ĠInt ) Ċ Ċ /** Ċ Ġ* ĠRepresents Ġthe Ġresult Ġof Ġparsing Ġthe Ġtime Ġand Ġoptionally Ġthe Ġoffset Ġin Ġseconds Ġin Ġsome Ġknown Ġformat Ċ Ġ*/ Ċ private Ġdata Ġclass ĠParsed Time ( val Ġhour : ĠInt , Ġval Ġmin : ĠInt , Ġval Ġsec : ĠInt , Ġval Ġns : ĠInt , Ġval Ġoffset Sec : ĠInt ) Ċ Ċ /** Ċ Ġ* ĠResult Ġof Ġparsing Ġa Ġstring Ġinto Ġits Ġcomponent Ġparts . ĠWe Ġonly Ġdeal Ġwith Ġparsing , Ġconversion Ġto Ġ[ Instant ] Ċ Ġ* Ġand Ġdealing Ġwith ĠTZ Ġoffsets Ġwill Ġbe Ġhandled Ġby Ġthe Ġunderlying Ġimplementation Ċ Ġ*/ Ċ internal Ġdata Ġclass ĠParsed Datetime ( ĊĠĠĠ Ġ// Ġ 4 Ġdigit Ġyear ĊĠĠĠ Ġval Ġyear : ĠInt , ĊĠĠĠ Ġ// Ġmonth ĠJan - Dec Ġas Ġ 1 - 1 2 ĊĠĠĠ Ġval Ġmonth : ĠInt , ĊĠĠĠ Ġ// Ġ 1 - 3 1 ĊĠĠĠ Ġval Ġday : ĠInt , ĊĠĠĠ Ġ// Ġ 0 - 2 3 ĊĠĠĠ Ġval Ġhour : ĠInt , ĊĠĠĠ Ġ// Ġ 0 - 5 9 ĊĠĠĠ Ġval Ġmin : ĠInt , ĊĠĠĠ Ġ// Ġ 0 - 6 0 ĊĠĠĠ Ġval Ġsec : ĠInt , ĊĠĠĠ Ġ// Ġ 0 - 9 9 9 _ 9 9 9 _ 9 9 9 ĊĠĠĠ Ġval Ġns : ĠInt , ĊĠĠĠ Ġ// Ġoffset Ġfrom ĠUTC Ġin Ġseconds ĊĠĠĠ Ġval Ġoffset Sec : ĠInt Ġ= Ġ 0 Ċ ) Ċ Ċ // ĠYYYY Ċ private Ġfun Ġdate Year (): ĠParser < Int > Ġ= Ġtake ND ig its ( 4 ) Ċ // ĠMM Ċ private Ġfun Ġdate Month (): ĠParser < Int > Ġ= Ġn Digits InRange ( 2 , Ġ 1 .. 1 2 ) Ċ // ĠDD Ġ( set Ġmin Digits Ġto Ġ 1 Ġto Ġallow Ġsingle Ġdigit ĠD ) Ċ private Ġfun Ġdate Day ( min Digits : ĠInt Ġ= Ġ 2 ): ĠParser < Int > Ġ= Ġmn Digits InRange ( min Digits , Ġ 2 , Ġ 1 .. 3 1 ) Ċ Ċ // ĠYYYY [- ] MM [- ] DD Ċ private Ġfun Ġdate Y md (): ĠParser < Parsed Date > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġval Ġ( pos 0 , Ġyear ) Ġ= Ġdate Year ()( str , Ġpos ) ĊĠĠĠ Ġval Ġ( pos 1 , Ġ_) Ġ= Ġoptional ( char ('- ')) ( str , Ġpos 0 ) ĊĠĠĠ Ġval Ġ( pos 2 , Ġmonth ) Ġ= Ġdate Month ()( str , Ġpos 1 ) ĊĠĠĠ Ġval Ġ( pos 3 , Ġ_) Ġ= Ġoptional ( char ('- ')) ( str , Ġpos 2 ) ĊĠĠĠ Ġval Ġ( pos 4 , Ġday ) Ġ= Ġdate Day ()( str , Ġpos 3 ) ĊĊĠĠĠ ĠParse Result ( pos 4 , ĠParsed Date ( year , Ġmonth , Ġday )) Ċ } Ċ Ċ // Ġallow Ġfor Ġalternatives Ġto Ġbe Ġadded . Ġcurrently Ġwe Ġdon 't Ġparse Ġweek Ġdates Ġor Ġordinal Ġdates Ġ( ne ither Ġdoes ĠC RT ) Ċ // Ġsee : Ġhttps :// github . com / aw sl abs / aws - c - common / blob / 8 7 5 4 0 e 4 9 6 a 7 d 1 b 5 c 6 c 7 7 8 b 4 cee 4 2 cd 8 6 5 c 6 9 f 7 dd / source / date _ time . c Ċ private Ġfun Ġdate (): ĠParser < Parsed Date > Ġ= Ġdate Y md () Ċ Ċ // ĠHH Ċ private Ġfun Ġtime Hour (): ĠParser < Int > Ġ= Ġn Digits InRange ( 2 , Ġ 0 .. 2 4 ) Ċ // ĠMM Ċ private Ġfun Ġtime Min (): ĠParser < Int > Ġ= Ġn Digits InRange ( 2 , Ġ 0 .. 5 9 ) Ċ // ĠSS Ġ( note Ġ 6 0 Ġis Ġvalid Ġand Ġden otes Ġa Ġle ap Ġsecond ) Ċ private Ġfun Ġtime Sec (): ĠParser < Int > Ġ= Ġn Digits InRange ( 2 , Ġ 0 .. 6 0 ) Ċ // Ġ. sss Ċ private Ġfun Ġtime Nan os (): ĠParser < Int > Ġ= Ġfraction ( 1 , Ġ 9 , Ġ 9 ) Ċ Ċ // Ġ+ |- Ċ // Ġresult Ġis Ġreturned Ġas Ġa Ġpositive Ġor Ġnegative Ġinteger Ġof Ġmagnitude Ġ 1 Ċ private Ġfun Ġsign Value (): ĠParser < Int > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġval Ġ( pos 0 , Ġs ) Ġ= Ġmap ( alt ( char ('+ '), Ġchar ('- '))) Ġ{ Ġchr Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( chr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ( str , Ġpos ) ĊĊĠĠĠ ĠParse Result ( pos 0 , Ġs ) Ċ } Ċ Ċ // ĠGet Ġthe ĠTZ Ġoffset Ġin Ġ( +- ) Ġseconds Ċ // Ġ+ |- hh : mm Ċ // Ġ+ |- hh mm Ċ // Ġ+ |- hh Ċ private Ġfun Ġtz Offset Hours M ins (): ĠParser < Int > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġval Ġ( pos 0 , Ġsign ) Ġ= Ġsign Value ()( str , Ġpos ) ĊĠĠĠ Ġval Ġ( pos 1 , Ġhours ) Ġ= Ġtime Hour ()( str , Ġpos 0 ) ĊĠĠĠ Ġval Ġ( pos 2 , Ġ_) Ġ= Ġoptional ( char (': ')) ( str , Ġpos 1 ) ĊĊĠĠĠ Ġval Ġ( pos 3 , Ġmin ) Ġ= Ġif Ġ( pos 2 Ġ< Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Min ()( str , Ġpos 2 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠParse Result ( pos 2 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoffset Sec : ĠInt Ġ= Ġsign Ġ* Ġ( hours Ġ* Ġ 3 6 0 0 Ġ+ Ġmin Ġ* Ġ 6 0 ) ĊĊĠĠĠ ĠParse Result ( pos 3 , Ġoffset Sec ) Ċ } Ċ Ċ // ĠZ | z Ċ private Ġfun Ġtz Utc (): ĠParser < Int > Ġ= Ġmap ( one Of (" Zz ")) Ġ{ Ġ 0 Ġ} Ċ Ċ private Ġfun Ġtz Offset Sec Iso 8 6 0 1 (): ĠParser < Int > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġalt ( tz Utc (), Ġtz Offset Hours M ins ()) ( str , Ġpos ) ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġimprove Ġthe Ġerror Ġmessage ĊĠĠĠĠĠĠĠ Ġthrow ĠParseException ( str , Ġ" invalid Ġtimezone Ġoffset ; Ġexpected Ġ` Z | z ` Ġor Ġ`( +- ) HH : MM `", Ġpos ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠHH : MM :[ SS ][ .( s *) ][ ( Z | z |+ ... |- ... )] Ċ private Ġfun Ġiso 8 6 0 1 Time (): ĠParser < Parsed Time > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġval Ġ( pos 0 , Ġhour ) Ġ= Ġtime Hour ()( str , Ġpos ) ĊĠĠĠ Ġval Ġ( pos 1 , Ġ_) Ġ= Ġoptional ( char (': ')) ( str , Ġpos 0 ) ĊĠĠĠ Ġval Ġ( pos 2 , Ġmin ) Ġ= Ġtime Min ()( str , Ġpos 1 ) ĊĊĠĠĠ Ġval Ġ( pos 3 , Ġ_) Ġ= Ġoptional ( char (': ')) ( str , Ġpos 2 ) ĊĠĠĠ Ġval Ġ( pos 4 , Ġsec ) Ġ= Ġtime Sec ()( str , Ġpos 3 ) ĊĠĠĠ Ġval Ġ( pos 5 , Ġns ) Ġ= Ġoptional Or ( pre ce ded ( one Of (" ., "), Ġtime Nan os ()), Ġ 0 )( str , Ġpos 4 ) ĊĠĠĠ Ġval Ġ( pos 6 , Ġoffset Sec ) Ġ= Ġtz Offset Sec Iso 8 6 0 1 ()( str , Ġpos 5 ) ĊĊĠĠĠ Ġ// ĠParse Result ( pos 6 , ĠParsed Time ( hour , Ġmin , Ġsec Ġ?: Ġ 0 , Ġns Ġ?: Ġ 0 , Ġoffset Sec Ġ?: Ġ 0 )) ĊĠĠĠ ĠParse Result ( pos 6 , ĠParsed Time ( hour , Ġmin , Ġsec , Ġns , Ġoffset Sec )) Ċ } Ċ Ċ /** Ċ Ġ* ĠParse Ġa Ġfull ĠISO - 8 6 0 1 Ġ( including ĠRFC 3 3 3 9 ) Ġdatetime Ġinto Ġit 's Ġcomponent Ġparts Ċ Ġ* Ċ Ġ* ĠNotes : Ċ Ġ* Ġ- ĠIf Ġthere Ġis Ġno Ġtimestamp Ġ( e . g . ĠYYYY - MM - DD ) Ġthen Ġthe Ġtimestamp Ġis Ġzero ed Ġand Ġassumed ĠUTC Ċ Ġ* Ġ- ĠThe Ġ` T ` Ġseparator Ġbetween Ġdate Ġand Ġtime Ġis Ġassumed . ĠOther Ġformats , Ġe . g . Ġusing Ġa Ġspace Ġinstead , Ċ Ġ* ĠĠ Ġare Ġnot Ġsupported Ġbecause Ġthey Ġhave Ġto Ġbe Ġmut ually Ġagreed Ġupon . Ċ Ġ*/ Ċ internal Ġfun Ġparse Iso 8 6 0 1 ( input : ĠString ): ĠParsed Datetime Ġ{ ĊĠĠĠ Ġval Ġ( pos 0 , Ġdate ) Ġ= Ġdate ()( input , Ġ 0 ) ĊĊĠĠĠ Ġ// Ġcheck Ġfor Ġend Ġof Ġinput ĠOR Ġparse Ġtimestamp , Ġusing Ġoptional Ġwould Ġsw allow Ġreal Ġerrors Ġwith Ġinvalid Ġtimestamps ĊĠĠĠ Ġval Ġts Ġ= Ġif Ġ( pos 0 Ġ== Ġinput . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbasic Ġdate , Ġno Ġtime Ġportion Ġfound Ġ( raw Ġdate Ġe . g . ĠYYYY - MM - DD ); Ġassumed ĠUTC ĊĠĠĠĠĠĠĠ ĠParsed Time ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfull Ġdatetime Ġassumed ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġtime ) Ġ= Ġprece ded ( one Of (" Tt "), Ġiso 8 6 0 1 Time ()) ( input , Ġpos 0 ) ĊĠĠĠĠĠĠĠ Ġtime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠParsed Datetime ( date . year , Ġdate . month , Ġdate . day , Ġts . hour , Ġts . min , Ġts . sec , Ġts . ns , Ġts . offset Sec ) Ċ } Ċ Ċ /** Ċ Ġ* ĠParse Ġan Ġepoch Ġtimestamp Ġ( with Ġor Ġwithout Ġfraction al Ġseconds ) Ġinto Ġan Ġinstant Ċ Ġ*/ Ċ internal Ġfun Ġparse Epoch ( input : ĠString ): ĠInstant Ġ{ ĊĠĠĠ Ġval Ġ( pos 0 , Ġsecs ) Ġ= Ġtake M ND ig its Long ( 1 , Ġ 1 9 )( input , Ġ 0 ) ĊĠĠĠ Ġreturn Ġif Ġ( pos 0 Ġ== Ġinput . length ) Ġ{ ĊĠĠĠĠĠĠĠ ĠInstant . from Epoch Seconds ( secs , Ġ 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġns ) Ġ= Ġprece ded ( char ('. '), Ġfraction ( 1 , Ġ 9 , Ġ 9 ))( input , Ġpos 0 ) ĊĠĠĠĠĠĠĠ ĠInstant . from Epoch Seconds ( secs , Ġns ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġday Name (): ĠParser < String > Ġ= Ġalt ( ĊĠĠĠ Ġtag (" Mon "), ĊĠĠĠ Ġtag (" Tue "), ĊĠĠĠ Ġtag (" Wed "), ĊĠĠĠ Ġtag (" Thu "), ĊĠĠĠ Ġtag (" Fri "), ĊĠĠĠ Ġtag (" Sat "), ĊĠĠĠ Ġtag (" Sun ") Ċ ) Ċ Ċ /** Ċ Ġ* ĠMatch Ġliteral Ġwhitespace Ċ Ġ*/ Ċ private Ġfun Ġsp ( input : ĠString , Ġpos : ĠInt ): ĠParse Result < Char > Ġ= Ġchar (' Ġ' )( input , Ġpos ) Ċ Ċ private Ġfun Ġdate Month Name (): ĠParser < Int > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġpre cond ( str , Ġpos , Ġ 3 ) ĊĠĠĠ Ġval Ġname Ġ= Ġstr . substring ( pos , Ġpos Ġ+ Ġ 3 ) ĊĠĠĠ Ġval Ġmonth Num Ġ= Ġwhen Ġ( name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Jan " Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ" Feb " Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġ" Mar " Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠ Ġ" Apr " Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġ" May " Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠ Ġ" Jun " Ġ-> Ġ 6 ĊĠĠĠĠĠĠĠ Ġ" Jul " Ġ-> Ġ 7 ĊĠĠĠĠĠĠĠ Ġ" Aug " Ġ-> Ġ 8 ĊĠĠĠĠĠĠĠ Ġ" Sep " Ġ-> Ġ 9 ĊĠĠĠĠĠĠĠ Ġ" Oct " Ġ-> Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ" Nov " Ġ-> Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġ" Dec " Ġ-> Ġ 1 2 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠParseException ( str , Ġ" invalid Ġmonth Ġ`$ name `", Ġpos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠParse Result ( pos Ġ+ Ġ 3 , Ġmonth Num ) Ċ } Ċ Ċ private Ġfun Ġtz Offset Sec R fc 5 3 2 2 (): ĠParser < Int > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġut c Offsets Ġ= Ġmap ( alt ( tag (" GMT "), Ġtag (" UTC "), Ġtag (" UT "), Ġtag (" Z "))) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġalt ( utc Offsets , Ġtz Offset Hours M ins ()) ( str , Ġpos ) ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġimprove Ġthe Ġerror Ġmessage ĊĠĠĠĠĠĠĠ Ġthrow ĠParseException ( str , Ġ" invalid Ġtimezone Ġoffset ; Ġexpected Ġ` GMT ` Ġor Ġ`( +- ) HH MM `", Ġpos ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġparse ĠRFC - 5 3 2 2 Ġtimestamp Ċ // ĠHH : MM [: SS ][ .( s * )] ĠGMT Ċ private Ġfun Ġr fc 5 3 2 2 Time (): ĠParser < Parsed Time > Ġ= Ġ{ Ġstr , Ġpos Ġ-> ĊĠĠĠ Ġval Ġ( pos 0 , Ġhour ) Ġ= Ġtime Hour ()( str , Ġpos ) ĊĠĠĠ Ġval Ġ( pos 1 , Ġmin ) Ġ= Ġprece ded ( char (': '), Ġtime Min ()) ( str , Ġpos 0 ) ĊĊĠĠĠ Ġval Ġ( pos 2 , Ġsec ) Ġ= Ġif Ġ( pos 1 Ġ< Ġstr . length Ġ&& Ġstr [ pos 1 ] Ġ== Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠ Ġprece ded ( char (': '), Ġtime Sec ()) ( str , Ġpos 1 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠParse Result ( pos 1 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ( pos 3 , Ġns ) Ġ= Ġoptional Or ( pre ce ded ( one Of (". "), Ġtime Nan os ()), Ġ 0 )( str , Ġpos 2 ) ĊĠĠĠ Ġval Ġ( pos 4 , Ġoffset Sec ) Ġ= Ġprece ded (:: sp , Ġtz Offset Sec R fc 5 3 2 2 ()) ( str , Ġpos 3 ) ĊĠĠĠ ĠParse Result ( pos 4 , ĠParsed Time ( hour , Ġmin , Ġsec , Ġns , Ġoffset Sec )) Ċ } Ċ Ċ /** Ċ Ġ* ĠParse Ġan ĠHTTP - date Ġas Ġdefined Ġby Ġthe ĠI MF - fix date Ġproduction Ġin Ċ Ġ* ĠRFC Ġ 7 2 3 1 # section - 7 . 1 . 1 . 1 Ġ( for Ġexample , ĠTue , Ġ 2 9 ĠApr Ġ 2 0 1 4 Ġ 1 8 : 3 0 : 3 8 ĠGMT ). Ċ Ġ* Ċ Ġ* ĠWhich Ġis Ġis Ġthe Ġfixed - length Ġand Ġsingle - zone Ġsubset Ġof Ġthe Ġdate Ġand Ġtime Ċ Ġ* Ġspecification Ġused Ġby Ġthe ĠInternet ĠMessage ĠFormat ĠRFC 5 3 2 2 Ġ( which Ġsuper se des ĠRFC 8 2 2 ) Ċ Ġ* Ċ Ġ* ĠSee : Ċ Ġ* Ġ- Ġhttps :// tools . ietf . org / html / rfc 7 2 3 1 . html # section - 7 . 1 . 1 . 1 Ċ Ġ* Ġ- Ġhttps :// tools . ietf . org / html / rfc 5 3 2 2 Ċ Ġ*/ Ċ internal Ġfun Ġparse R fc 5 3 2 2 ( input : ĠString ): ĠParsed Datetime Ġ{ ĊĊĠĠĠ Ġ// Ġdow Ġis Ġoptional , Ġif Ġfirst Ġcharacter Ġis Ġdigit Ġskip Ġit ĊĠĠĠ Ġ// Ġotherwise Ġconsume Ġit Ġand Ġadvance ĊĠĠĠ Ġval Ġ( pos 0 , Ġ_) Ġ= Ġif Ġ( input . isNotBlank () Ġ&& Ġ! is Digit ( input [ 0 ])) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmust Ġbe Ġe . g . Ġ` Mon , Ġ` Ġwith Ġthe Ġspace Ġnot Ġoptional Ġwhen Ġdow Ġis Ġpresent ĊĠĠĠĠĠĠĠ Ġmap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġday Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( char (',' )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then (:: sp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġnull Ġ} ( input , Ġ 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠParse Result ( 0 , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġr fc 5 3 2 2 Ġallows Ġsingle Ġdigit Ġdays ĊĠĠĠ Ġval Ġ( pos 1 , Ġday ) Ġ= Ġdate Day ( min Digits Ġ= Ġ 1 )( input , Ġpos 0 ) ĊĠĠĠ Ġval Ġ( pos 2 , Ġmonth ) Ġ= Ġprece ded (:: sp , Ġdate Month Name ()) ( input , Ġpos 1 ) ĊĠĠĠ Ġval Ġ( pos 3 , Ġyear ) Ġ= Ġprece ded (:: sp , Ġdate Year ()) ( input , Ġpos 2 ) ĊĠĠĠ Ġval Ġ(_, Ġts ) Ġ= Ġprece ded (:: sp , Ġr fc 5 3 2 2 Time ()) ( input , Ġpos 3 ) ĊĊĠĠĠ Ġ// ĠSun , Ġ 0 6 ĠNov Ġ 1 9 9 4 Ġ 0 8 : 4 9 : 3 7 ĠGMT ĊĠĠĠ Ġreturn ĠParsed Datetime ( year , Ġmonth , Ġday , Ġts . hour , Ġts . min , Ġts . sec , Ġts . ns , Ġts . offset Sec ) Ċ } Ċ