Skip to content

Commit 01d37fb

Browse files
committed
Add support for RFC2822
1 parent acf2f4f commit 01d37fb

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

lib/DateTime/Parse.pm6

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ my class X::DateTime::CannotParse is Exception {
66
class 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

t/01-basic.t

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use DateTime::Parse;
55
plan *;
66

77
my $rfc1123 = 'Sun, 06 Nov 1994 08:49:37 GMT';
8+
my $rfc2822 = 'Sun, 06 Nov 1994 08:49:37 -0800';
89
my $bad = 'Bad, 06 Nov 1994 08:49:37 GMT';
910
my $rfc850 = 'Sunday, 06-Nov-94 08:49:37 GMT';
1011
my $rfc850v = 'Sun 06-Nov-1994 08:49:37 GMT';
@@ -20,7 +21,11 @@ is DateTime::Parse.new('08:49:37', :rule<time>).sort,
2021
is DateTime::Parse.new($rfc1123),
2122
DateTime.new(:year(1994), :month(11), :day(6), :hour(8), :minute(49), :second(37)),
2223
'parse string gives correct DateTime object';
24+
is DateTime::Parse.new($rfc2822),
25+
DateTime.new(:year(1994), :month(11), :day(6), :hour(8), :minute(49), :second(37), :timezone(-28800)),
26+
'parse string gives correct DateTime object';
2327
ok DateTime::Parse::Grammar.parse($rfc1123)<rfc1123-date>, "'Sun, 06 Nov 1994 08:49:37 GMT' is recognized as rfc1123-date";
28+
ok DateTime::Parse::Grammar.parse($rfc2822)<rfc2822-date>, "'$rfc2822' is recognized as rfc2822-date";
2429
throws-like qq[ DateTime::Parse.new('$bad') ], X::DateTime::CannotParse, invalid-str => $bad;
2530
ok DateTime::Parse::Grammar.parse($rfc850)<rfc850-date>, "'$rfc850' is recognized as rfc850-date";
2631
nok DateTime::Parse::Grammar.parse($rfc850v)<rfc850-date>, "'$rfc850v' is NOT recognized as rfc850-date";

0 commit comments

Comments
 (0)