@@ -6,7 +6,13 @@ 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 >
10+ | <dt = rfc1123 - date >
11+ | <dt = rfc2822 - date >
12+ | <dt = rfc850 - date >
13+ | <dt = rfc850 - var - date >
14+ | <dt = rfc850 - var - date - two >
15+ | <dt = asctime - date >
1016 }
1117
1218 token rfc3339-date {
@@ -21,6 +27,10 @@ class DateTime::Parse is DateTime {
2127 <part = .partial - time > <offset = .time - offset >
2228 }
2329
30+ token time3 {
31+ <part = .time > <.SP > <offset = .time - offset2 >
32+ }
33+
2434 token partial-time {
2535 <hour = .D2 > ':' <minute = .D2 > ':' <second = .D2 > <frac = .time - secfrac >?
2636 }
@@ -33,6 +43,10 @@ class DateTime::Parse is DateTime {
3343 [ 'Z' | 'z' | <offset = .time - numoffset >]
3444 }
3545
46+ token time-offset2 {
47+ <sign = [ +- ] > <hour = .D2 > <minute = .D2 >
48+ }
49+
3650 token time-numoffset {
3751 <sign = [ +- ] > <hour = .D2 > ':' <minute = .D2 >
3852 }
@@ -53,6 +67,10 @@ class DateTime::Parse is DateTime {
5367 <.wkday > ',' <.SP > <date = .date1 > <.SP > <time > <.SP > <gmtUtc >
5468 }
5569
70+ token rfc2822-date {
71+ <.wkday > ',' <.SP > <date = .date1 > <.SP > <time = .time3 >
72+ }
73+
5674 token rfc850-date {
5775 <.weekday > ',' <.SP > <date = .date2 > <.SP > <time > <.SP > <gmtUtc >
5876 }
@@ -147,6 +165,10 @@ class DateTime::Parse is DateTime {
147165 make DateTime . new (| $ < date > . made , | $ < time > . made )
148166 }
149167
168+ method rfc2822-date ($/ ) {
169+ make DateTime . new (| $ < date > . made , | $ < time > . made )
170+ }
171+
150172 method rfc850-date ($/ ) {
151173 make DateTime . new (| $ < date > . made , | $ < time > . made )
152174 }
@@ -228,6 +250,16 @@ class DateTime::Parse is DateTime {
228250 make % res ;
229251 }
230252
253+ method time3 ($/ ) {
254+ my $ p = $ < part > ;
255+ my $ offset = 0 ;
256+ if ~ $ < offset >< sign > eq ' -' {
257+ $ offset = 3600 * ~ $ < offset >< hour > . Int ;
258+ $ offset += 60 * ~ $ < offset >< minute > . Int ;
259+ }
260+ my % res = hour => ~ $ p <hour >, minute => ~ $ p <minute >, second => ~ $ p <second >, timezone => -$ offset ;
261+ make % res ;
262+ }
231263 my % wkday = Mon => 0 , Tue => 1 , Wed => 2 , Thu => 3 , Fri => 4 , Sat => 5 , Sun => 6 ;
232264 method wkday ($/ ) {
233265 make % wkday {~ $/ }
@@ -287,6 +319,7 @@ DateTime::Parse - DateTime parser
287319= head2 Available formats:
288320
289321= item rfc1123
322+ = item rfc2822
290323= item rfc850
291324= item asctime
292325
0 commit comments