Skip to content

Commit 2eb140d

Browse files
committed
Merge branch 'Tyil-nginx-timestamps'
2 parents 9a78fee + 0451517 commit 2eb140d

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

lib/DateTime/Parse.rakumod

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,25 @@ 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> | <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{~$/}

t/01-nginx-accesslog-timestamps.t

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#! /usr/bin/env perl6
2+
3+
use v6.c;
4+
5+
use DateTime::Parse;
6+
use Test;
7+
8+
my @timestamps = «
9+
"28/Mar/2018:10:20:01 +0000"
10+
"28/Mar/2018:10:20:04 +0000"
11+
"28/Mar/2018:10:20:07 +0000"
12+
"28/Mar/2018:10:20:09 +0000"
13+
"28/Mar/2018:10:20:51 +0000"
14+
"28/Mar/2018:10:21:15 +0200"
15+
"28/Mar/2018:10:21:17 +0030"
16+
»;
17+
18+
plan @timestamps.elems + 1;
19+
20+
for @timestamps {
21+
lives-ok { DateTime::Parse.new($_); }, "$_ parses";
22+
}
23+
24+
subtest "28/Mar/2018:10:21:17 +0000 parses correctly" => {
25+
my $dt = DateTime::Parse.new("28/Mar/2018:10:21:17 +0000");
26+
27+
plan 7;
28+
29+
isa-ok $dt, DateTime, "Returns a DateTime object";
30+
31+
is $dt.year, 2018, "Year is correct";
32+
is $dt.month, 3, "Month is correct";
33+
is $dt.day, 28, "Day is correct";
34+
is $dt.hour, 10, "Hour is correct";
35+
is $dt.minute, 21, "Minute is correct";
36+
is $dt.second, 17, "Second is correct";
37+
}
38+
39+
# vim: ft=perl6 noet

0 commit comments

Comments
 (0)