@@ -6,21 +6,25 @@ my class X::DateTime::CannotParse is Exception {
66class DateTime::Parse is DateTime {
77 grammar DateTime::Parse::Grammar {
88 token TOP {
9- <dt = rfc3339 - date > | <dt = rfc1123 - date > | <dt = rfc850 - date > | <dt = rfc850 - var - date > | <dt = rfc850 - var - date - two > | <dt = asctime - date >
9+ <dt = rfc3339 - date > | <dt = rfc1123 - date > | <dt = rfc850 - date > | <dt = rfc850 - var - date > | <dt = asctime - date > | <dt = nginx - date >
1010 }
1111
1212 token rfc3339-date {
1313 <date = .date5 > <[ Tt \x0020 ] > <time = .time2 >
1414 }
1515
16- token date5 {
17- <year = .D4 - year > '- ' <month = .D2 > '-' < day = .D2 >
16+ token nginx-date {
17+ <date = .date6 > ': ' <time = .time3 >
1818 }
1919
2020 token time2 {
2121 <part = .partial - time > <offset = .time - offset >
2222 }
2323
24+ token time3 {
25+ <time = .partial - time > ' ' <time - numoffset >
26+ }
27+
2428 token partial-time {
2529 <hour = .D2 > ':' <minute = .D2 > ':' <second = .D2 > <frac = .time - secfrac >?
2630 }
@@ -34,7 +38,7 @@ class DateTime::Parse is DateTime {
3438 }
3539
3640 token time-numoffset {
37- <sign = [ +- ] > <hour = .D2 > ':' <minute = .D2 >
41+ <sign = [ +- ] > <hour = .D2 > ':' ? <minute = .D2 >
3842 }
3943
4044 token time-houroffset {
@@ -93,6 +97,14 @@ class DateTime::Parse is DateTime {
9397 <day = .D2 > '-' <month > '-' <year = .D4 - year >
9498 }
9599
100+ token date5 {
101+ <year = .D4 - year > '-' <month = .D2 > '-' <day = .D2 >
102+ }
103+
104+ token date6 {
105+ <day = .D2 > '/' <month > '/' <year = .D4 - year >
106+ }
107+
96108 token time {
97109 <hour = .D2 > ':' <minute = .D2 > ':' <second = .D2 >
98110 }
@@ -168,6 +180,10 @@ class DateTime::Parse is DateTime {
168180 make DateTime . new (| $ < date > . made , | $ < time > . made , : timezone($ tz ))
169181 }
170182
183+ method nginx-date ($/ ) {
184+ make DateTime . new (| $ < date > . made , | $ < time > . made );
185+ }
186+
171187 method ! genericDate ($/ ) {
172188 make { year => $ < year > . made , month => $ < month > . made , day => $ < day > . made }
173189 }
@@ -192,6 +208,10 @@ class DateTime::Parse is DateTime {
192208 self ! genericDate($/ );
193209 }
194210
211+ method date6 ($/ ) { # e.g. 28/Mar/2018
212+ self ! genericDate($/ );
213+ }
214+
195215 my % timezones =
196216 UTC => 0 ,
197217 GMT => 0 ,
@@ -228,6 +248,20 @@ class DateTime::Parse is DateTime {
228248 make % res ;
229249 }
230250
251+ method time3 ($/ ) {
252+ my Int $ offset = 0 ;
253+
254+ $ offset += + $ < time-numoffset >< hour > × 60 ;
255+ $ offset += + $ < time-numoffset >< minute > ;
256+
257+ make {
258+ hour => + $ < time >< hour > ,
259+ minute => + $ < time >< minute > ,
260+ second => + $ < time >< second > ,
261+ timezone => $ offset ,
262+ };
263+ }
264+
231265 my % wkday = Mon => 0 , Tue => 1 , Wed => 2 , Thu => 3 , Fri => 4 , Sat => 5 , Sun => 6 ;
232266 method wkday ($/ ) {
233267 make % wkday {~ $/ }
0 commit comments