Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 33 additions & 2 deletions lib/DateTime/Parse.rakumod
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ my class X::DateTime::CannotParse is Exception {
method message() { "Unable to parse {$!invalid-str}" }
}

class DateTime::Parse is DateTime {
#use Grammar::Tracer;

role DateTime::Parse is DateTime {
grammar DateTime::Parse::Grammar {
token TOP {
<dt=rfc3339-date> | <dt=rfc1123-date> | <dt=rfc850-date> | <dt=rfc850-var-date> | <dt=rfc850-var-date-two> | <dt=asctime-date> | <dt=nginx-date>
<dt=rfc3339-date> | <dt=rfc1123-date> | <dt=rfc850-date> | <dt=rfc850-var-date> | <dt=rfc850-var-date-two> |
<dt=asctime-date> | <dt=nginx-date>
}

token rfc3339-date {
Expand Down Expand Up @@ -81,6 +84,10 @@ class DateTime::Parse is DateTime {
\w+
}

token date {
<date=.date1> | <date=.date2> | <date=.date3> | <date=.date4> | <date=.date5> | <date=.date6> | <date=.date7>
}

token date1 { # e.g., 02 Jun 1982
<day=.D2> <.SP> <month> <.SP> <year=.D4-year>
}
Expand All @@ -105,6 +112,10 @@ class DateTime::Parse is DateTime {
<day=.D2> '/' <month> '/' <year=.D4-year>
}

token date7 {
<day> <.TH> <.SP> <month=month-long> <.SP> <year=.D4-year>
}

token time {
<hour=.D2> ':' <minute=.D2> ':' <second=.D2>
}
Expand All @@ -125,6 +136,10 @@ class DateTime::Parse is DateTime {
'Jan' | 'Feb' | 'Mar' | 'Apr' | 'May' | 'Jun' | 'Jul' | 'Aug' | 'Sep' | 'Oct' | 'Nov' | 'Dec'
}

token month-long {
<month> \w*
}

token D4-year {
\d ** 4
}
Expand All @@ -144,6 +159,10 @@ class DateTime::Parse is DateTime {
token D2 {
\d ** 2
}

token TH {
'st' | 'nd' | 'rd' | 'th'
}
}

class DateTime::Parse::Actions {
Expand Down Expand Up @@ -194,6 +213,10 @@ class DateTime::Parse is DateTime {
make { year => $<year>.made, month => $<month>.made, day => $<day>.made }
}

method date($/) {
make { year => $<date><year>.made, month => $<date><month>.made, day => $<date><day>.made }
}

method date1($/) { # e.g., 02 Jun 1982
self!genericDate($/);
}
Expand All @@ -218,6 +241,10 @@ class DateTime::Parse is DateTime {
self!genericDate($/);
}

method date7($/) { # e.g. 28th Mar 2023
self!genericDate($/);
}

my %timezones =
UTC => 0,
GMT => 0,
Expand Down Expand Up @@ -285,6 +312,10 @@ class DateTime::Parse is DateTime {
make %month{~$/}
}

method month-long($/) {
make %month{~$/<month>}
}

method day($/) {
make +$/
}
Expand Down
4 changes: 4 additions & 0 deletions t/01-basic.t
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ my $rfc3339_2 = '1996-12-19T16:39:57-08:00';
is DateTime::Parse.new('Sun', :rule<wkday>), 6, "'Sun' is day 6 in rule wkday";
is DateTime::Parse.new('06 Nov 1994', :rule<date1>).sort,
{"day" => 6, "month" => 11, "year" => 1994}.sort, "we parse '06 Nov 1994' as rule date1";
is DateTime::Parse.new('20th September 2023', :rule<date7>).sort,
{"day" => 20, "month" => 9, "year" => 2023}.sort, "we parse '20th September 2023' as rule date7";
is DateTime::Parse.new('20th September 2023', :rule<date>).sort,
{"day" => 20, "month" => 9, "year" => 2023}.sort, "we parse '20th September 2023' as rule date";
is DateTime::Parse.new('08:49:37', :rule<time>).sort,
{"hour" => 8, "minute" => 49, "second" => 37}.sort, "we parse '08:49:37' as rule time";
is DateTime::Parse.new($rfc1123),
Expand Down