File Coverage

blib/lib/DateTime/Format/Natural/Lang/EN.pm
Criterion Covered Total %
statement 24 24 100.0
branch n/a
condition n/a
subroutine 8 8 100.0
pod n/a
total 32 32 100.0


line stmt bran cond sub pod time code
1             package DateTime::Format::Natural::Lang::EN;
2              
3 26     26   2864 use strict;
  26         72  
  26         854  
4 26     26   185 use warnings;
  26         103  
  26         854  
5 26     26   197 use base qw(DateTime::Format::Natural::Lang::Base);
  26         93  
  26         12379  
6             # XXX constant.pm true/false: workaround for a segmentation fault
7             # in Perl_mg_find() on perl 5.8.9 and 5.10.0 when using boolean.pm
8             # v0.20 (tested as of 12/02/2009).
9             #use boolean qw(true false);
10 26     26   237 use constant true => 1;
  26         77  
  26         1988  
11 26     26   179 use constant false => 0;
  26         90  
  26         1293  
12 26     26   160 use constant skip => true;
  26         96  
  26         1117  
13 26     26   176 use constant milli_to_nano => 1_000_000;
  26         93  
  26         1306  
14              
15 26     26   202 use DateTime::Format::Natural::Helpers qw(%flag);
  26         80  
  26         823963  
16              
17             our $VERSION = '1.72';
18              
19             our (%init,
20             %timespan,
21             %units,
22             %suffixes,
23             %regexes,
24             %re,
25             %RE,
26             %data_weekdays,
27             %data_weekdays_abbrev,
28             @data_weekdays_all,
29             %data_months,
30             %data_months_abbrev,
31             @data_months_all,
32             %data_conversion,
33             %data_helpers,
34             %data_duration,
35             %data_aliases,
36             %data_rewrite,
37             %extended_checks,
38             %grammar);
39              
40             %init = (tokens => sub {});
41             %timespan = (literal => 'to');
42             %units = (ordered => [ qw(nanosecond second minute hour day week month year) ]);
43             %suffixes = (ordinal => join '|', qw(st nd rd th d));
44             %regexes = (format_ => qr!((?:\d+?(?:-(?:[a-zA-Z]+?|\d+?)-|[./]\d+?[./])\d+?) | (?:\d+?/\d+?))!x);
45              
46             $regexes{format} = qr/^$regexes{format_}(?:(?=\s)|$)/;
47              
48             %re = (number => qr/(\d+)/,
49             year => qr/(\d{4})/,
50             time => qr/((?:\d{1,2})(?:\:\d{2}(?:\:\d{2}(?:\.\d{3})?)?)?)/,
51             time_am => qr/((?:\d{1,2})(?:\:\d{2}(?:\:\d{2}(?:\.\d{3})?)?)?)am/i,
52             time_pm => qr/((?:\d{1,2})(?:\:\d{2}(?:\:\d{2}(?:\.\d{3})?)?)?)pm/i,
53             time_min => qr/(\d{1,2}\:\d{2}(?:\:\d{2}(?:\.\d{3})?)?)/,
54             day => qr/(\d+)($suffixes{ordinal})?/i,
55             monthday => qr/(\d{1,2})($suffixes{ordinal})?/i);
56             {
57             foreach my $name (keys %re) {
58             $RE{$name} = qr/^$re{$name}$/;
59             }
60              
61             my $sort = sub
62             {
63             my ($data) = @_;
64             return sort { $data->{$a} <=> $data->{$b} } keys %$data;
65             };
66             my $sort_abbrev = sub
67             {
68             my ($data_abbrev, $data) = @_;
69             return sort {
70             $data->{$data_abbrev->{$a}} <=> $data->{$data_abbrev->{$b}}
71             } keys %$data_abbrev;
72             };
73              
74             my $i = 1;
75              
76             %data_weekdays = map {
77             $_ => $i++
78             } qw(Monday Tuesday Wednesday Thursday Friday Saturday Sunday);
79             %data_weekdays_abbrev = map {
80             substr($_, 0, 3) => $_
81             } keys %data_weekdays;
82              
83             @data_weekdays_all = ($sort->(\%data_weekdays), $sort_abbrev->(\%data_weekdays_abbrev, \%data_weekdays));
84              
85             my $days_re = join '|', @data_weekdays_all;
86             $re{weekday} = qr/($days_re)/i;
87             $RE{weekday} = qr/^$re{weekday}$/;
88              
89             $days_re = join '|', map "${_}s?", @data_weekdays_all;
90             $re{weekdays} = qr/($days_re)/i;
91             $RE{weekdays} = qr/^$re{weekdays}$/;
92              
93             $i = 1;
94              
95             %data_months = map {
96             $_ => $i++
97             } qw(January February March April May June July August September
98             October November December);
99             %data_months_abbrev = map {
100             substr($_, 0, 3) => $_
101             } keys %data_months;
102              
103             @data_months_all = ($sort->(\%data_months), $sort_abbrev->(\%data_months_abbrev, \%data_months));
104              
105             my $months_re = join '|', @data_months_all;
106             $re{month} = qr/($months_re)/i;
107             $RE{month} = qr/^$re{month}$/;
108              
109             %data_conversion = (
110             last_this_next => { do { $i = -1; map { $_ => $i++ } qw(last this next) } },
111             yes_today_tom => { do { $i = -1; map { $_ => $i++ } qw(yesterday today tomorrow) } },
112             noon_midnight => { noon => 12, midnight => 0 },
113             morn_aftern_even => { do { $i = 0; map { $_ => $i++ } qw(morning afternoon evening) } },
114             before_after_from => { before => -1, after => 1, from => 1 },
115             );
116              
117             %data_helpers = (
118             suffix => qr/s$/i,
119             normalize => sub { ${$_[0]} = ucfirst lc ${$_[0]} },
120             abbreviated => sub { length ${$_[0]} == 3 },
121             );
122              
123             %data_duration = (
124             for => {
125             regex => qr/^for \s+ \d+ \s+ \S+$/ix,
126             present => 'now',
127             },
128             first_to_last => {
129             regexes => {
130             first => qr/first/i,
131             last => qr/last \s+ day \s+ of \s+ (?:$re{month}|$re{year})/ix,
132             extract => qr/^\S+? \s+ (.+)$/x,
133             },
134             },
135             from_count_to_count => {
136             regexes => {
137             time_meridiem => qr/\d{1,2}(?:\:\d{2}){0,2}(?:\s*?(?:am|pm))/i,
138             time => qr/\d{1,2}(?:\:\d{2}){1,2}/,
139             day_ordinal => qr/\d{1,3}(?:$suffixes{ordinal})/i,
140             day => qr/\d{1,3}/,
141             },
142             order => [qw(
143             time_meridiem
144             time
145             day_ordinal
146             day
147             )],
148             categories => {
149             time_meridiem => 'time',
150             time => 'time',
151             day_ordinal => 'day',
152             day => 'day',
153             },
154             extract => {
155             left => {
156             time => qr/(?:$regexes{format_}|$re{day}\s+$re{month}|$re{month}\s+$re{day})/,
157             day => qr/$re{month}/,
158             },
159             right => {
160             time => qr/(?:$re{day}\s+$re{month}|$re{month}\s+$re{day})/,
161             day => qr/(?:$re{month}|day)/i,
162             },
163             },
164             },
165             );
166              
167             %data_aliases = (
168             words => {
169             tues => 'tue',
170             thur => 'thu',
171             thurs => 'thu',
172             },
173             tokens => {
174             msec => 'millisecond',
175             msecs => 'milliseconds',
176             sec => 'second',
177             secs => 'seconds',
178             min => 'minute',
179             mins => 'minutes',
180             hr => 'hour',
181             hrs => 'hours',
182             yr => 'year',
183             yrs => 'years',
184             '@' => 'at',
185             },
186             short => {
187             min => 'minute',
188             d => 'day',
189             },
190             );
191              
192             %data_rewrite = (
193             at => {
194             match => qr/\S+? \s+? at \s+? (\S+)/ix,
195             subst => qr/\s+? at \b/ix,
196             daytime => qr/^(?:noon|midnight)$/i,
197             },
198             );
199             }
200              
201             %extended_checks = (
202             meridiem => sub
203             {
204             my ($first_stack, $rest_stack, $pos, $error) = @_;
205              
206             my ($hour) = split /:/, $first_stack->{$pos->[0]};
207              
208             if ($hour == 0) {
209             $$error = 'hour zero must be literal 12';
210             return false;
211             }
212             elsif ($hour > 12) {
213             $$error = 'hour exceeds 12-hour clock';
214             return false;
215             }
216             return true;
217             },
218             ordinal => sub
219             {
220             my ($first_stack, $rest_stack, $pos, $error) = @_;
221              
222             my $suffix = do {
223             local $_ = $rest_stack->{$pos->[0]}->[0];
224             defined $_ ? lc $_ : undef;
225             };
226             return skip unless defined $suffix;
227              
228             my $numeral = $first_stack->{$pos->[0]};
229              
230             my %ordinals = (
231             1 => { regex => qr/^st$/, suffix => 'st' },
232             2 => { regex => qr/^n?d$/, suffix => 'nd' },
233             3 => { regex => qr/^r?d$/, suffix => 'rd' },
234             );
235              
236             my $fail_message = sub { "letter suffix should be '$_[0]'" };
237              
238             local $1;
239             if ($numeral == 0) {
240             unless ($suffix eq 'th') {
241             $$error = $fail_message->('th');
242             return false;
243             }
244             return true;
245             }
246             elsif ($numeral =~ /([1-3])$/ && $numeral !~ /1\d$/) {
247             unless ($suffix =~ $ordinals{$1}->{regex}) {
248             $$error = $fail_message->($ordinals{$1}->{suffix});
249             return false;
250             }
251             return true;
252             }
253             elsif ($numeral > 3) {
254             unless ($suffix eq 'th') {
255             $$error = $fail_message->('th');
256             return false;
257             }
258             return true;
259             }
260             return skip; # never reached
261             },
262             suffix => sub
263             {
264             my ($first_stack, $rest_stack, $pos, $error) = @_;
265              
266             my @checks = (
267             { cond => sub { $first_stack->{$pos->[0]} == 1 && $first_stack->{$pos->[1]} =~ $data_helpers{suffix} },
268             error => "suffix 's' without plural",
269             },
270             { cond => sub { $first_stack->{$pos->[0]} > 1 && $first_stack->{$pos->[1]} !~ $data_helpers{suffix} },
271             error => "plural without suffix 's'",
272             },
273             );
274             foreach my $check (@checks) {
275             if ($check->{cond}->()) {
276             $$error = $check->{error};
277             return false;
278             }
279             }
280             return true;
281             },
282             );
283              
284             # <keyword> => [
285             # [ <PERL TYPE DECLARATION>, ... ], ---------------------> declares how the tokens will be evaluated
286             # [
287             # { <token index> => <token value>, ... }, ------------> declares the index <-> value map
288             # [ [ <index(es) of token(s) to be passed> ], ... ], --> declares which tokens will be passed to the extended check(s)
289             # [ <subroutine(s) for extended check(s)>, ... ], -----> declares the extended check(s)
290             # [ [ <index(es) of token(s) to be passed> ], ... ], --> declares which tokens will be passed to the worker method(s)
291             # [ { <additional options to be passed> }, ... ], -----> declares additional options
292             # [ <name of method to dispatch to>, ... ], -----------> declares the worker method(s)
293             # { <shared option>, ... }, ---------------------------> declares shared options (post-processed)
294             # ],
295              
296             #
297             # NOTE: the grammar here does not cover all valid input string
298             # variations; see Rewrite.pm for how date strings are rewritten
299             # before parsing.
300             #
301              
302             %grammar = (
303             now => [
304             [ 'SCALAR' ],
305             [
306             { 0 => 'now' },
307             [],
308             [],
309             [ [] ],
310             [ {} ],
311             [ '_no_op' ],
312             {},
313             ],
314             ],
315             day => [
316             [ 'REGEXP' ],
317             [
318             { 0 => qr/^(today)$/i },
319             [],
320             [],
321             [
322             [
323             { 0 => [ $flag{yes_today_tom} ] },
324             ],
325             ],
326             [ { unit => 'day' } ],
327             [ '_unit_variant' ],
328             { truncate_to => [q(day)] },
329             ],
330             [
331             { 0 => qr/^(yesterday)$/i },
332             [],
333             [],
334             [
335             [
336             { 0 => [ $flag{yes_today_tom} ] },
337             ],
338             ],
339             [ { unit => 'day' } ],
340             [ '_unit_variant' ],
341             { truncate_to => [q(day)] },
342             ],
343             [
344             { 0 => qr/^(tomorrow)$/i },
345             [],
346             [],
347             [
348             [
349             { 0 => [ $flag{yes_today_tom} ] },
350             ],
351             ],
352             [ { unit => 'day' } ],
353             [ '_unit_variant' ],
354             { truncate_to => [q(day)] },
355             ],
356             ],
357             daytime => [
358             [ 'REGEXP' ],
359             [
360             { 0 => qr/^(morning)$/i },
361             [],
362             [],
363             [
364             [
365             { 0 => [ $flag{morn_aftern_even} ] },
366             ],
367             ],
368             [ {} ],
369             [ '_daytime_variant' ],
370             {
371             advance_future => true,
372             truncate_to => [q(hour)],
373             },
374             ],
375             [
376             { 0 => qr/^(afternoon)$/i },
377             [],
378             [],
379             [
380             [
381             { 0 => [ $flag{morn_aftern_even} ] },
382             ],
383             ],
384             [ {} ],
385             [ '_daytime_variant' ],
386             {
387             advance_future => true,
388             truncate_to => [q(hour)],
389             },
390             ],
391             [
392             { 0 => qr/^(evening)$/i },
393             [],
394             [],
395             [
396             [
397             { 0 => [ $flag{morn_aftern_even} ] },
398             ],
399             ],
400             [ {} ],
401             [ '_daytime_variant' ],
402             {
403             advance_future => true,
404             truncate_to => [q(hour)],
405             },
406             ]
407             ],
408             daytime_noon_midnight => [
409             [ 'REGEXP' ],
410             [
411             { 0 => qr/^(noon)$/i },
412             [],
413             [],
414             [
415             [
416             { 0 => [ $flag{noon_midnight} ] },
417             ],
418             ],
419             [ {} ],
420             [ '_daytime' ],
421             {
422             advance_future => true,
423             truncate_to => [q(hour)],
424             },
425             ],
426             [
427             { 0 => qr/^(midnight)$/i },
428             [],
429             [],
430             [
431             [
432             { 0 => [ $flag{noon_midnight} ] },
433             ]
434             ],
435             [ {} ],
436             [ '_daytime' ],
437             {
438             advance_future => true,
439             truncate_to => [q(hour)],
440             },
441             ],
442             ],
443             daytime_noon_midnight_at => [
444             [ 'REGEXP', 'REGEXP' ],
445             [
446             { 0 => qr/^(yesterday)$/i, 1 => qr/^(noon)$/i },
447             [],
448             [],
449             [
450             [
451             { 0 => [ $flag{yes_today_tom} ] },
452             ],
453             [
454             { 1 => [ $flag{noon_midnight} ] },
455             ],
456             ],
457             [ { unit => 'day' }, {} ],
458             [ '_unit_variant', '_daytime' ],
459             { truncate_to => [undef, q(hour)] },
460             ],
461             [
462             { 0 => qr/^(yesterday)$/i, 1 => qr/^(midnight)$/i },
463             [],
464             [],
465             [
466             [
467             { 0 => [ $flag{yes_today_tom} ] },
468             ],
469             [
470             { 1 => [ $flag{noon_midnight} ] },
471             ],
472             ],
473             [ { unit => 'day' }, {} ],
474             [ '_unit_variant', '_daytime' ],
475             { truncate_to => [undef, q(hour)] },
476             ],
477             [
478             { 0 => qr/^(today)$/i, 1 => qr/^(noon)$/i },
479             [],
480             [],
481             [
482             [
483             { 0 => [ $flag{yes_today_tom} ] },
484             ],
485             [
486             { 1 => [ $flag{noon_midnight} ] },
487             ],
488             ],
489             [ { unit => 'day' }, {} ],
490             [ '_unit_variant', '_daytime' ],
491             { truncate_to => [undef, q(hour)] },
492             ],
493             [
494             { 0 => qr/^(today)$/i, 1 => qr/^(midnight)$/i },
495             [],
496             [],
497             [
498             [
499             { 0 => [ $flag{yes_today_tom} ] },
500             ],
501             [
502             { 1 => [ $flag{noon_midnight} ] },
503             ],
504             ],
505             [ { unit => 'day' }, {} ],
506             [ '_unit_variant', '_daytime' ],
507             { truncate_to => [undef, q(hour)] },
508             ],
509             [
510             { 0 => qr/^(tomorrow)$/i, 1 => qr/^(noon)$/i },
511             [],
512             [],
513             [
514             [
515             { 0 => [ $flag{yes_today_tom} ] },
516             ],
517             [
518             { 1 => [ $flag{noon_midnight} ] },
519             ]
520             ],
521             [ { unit => 'day' }, {} ],
522             [ '_unit_variant', '_daytime' ],
523             { truncate_to => [undef, q(hour)] },
524             ],
525             [
526             { 0 => qr/^(tomorrow)$/i, 1 => qr/^(midnight)$/i },
527             [],
528             [],
529             [
530             [
531             { 0 => [ $flag{yes_today_tom} ] },
532             ],
533             [
534             { 1 => [ $flag{noon_midnight} ] },
535             ],
536             ],
537             [ { unit => 'day' }, {} ],
538             [ '_unit_variant', '_daytime' ],
539             { truncate_to => [undef, q(hour)] },
540             ],
541             ],
542             daytime_variant_weekday => [
543             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
544             [
545             { 0 => qr/^(noon)$/i, 1 => qr/^(next)$/i, 2 => $RE{weekday} },
546             [],
547             [],
548             [
549             [
550             { 0 => [ $flag{noon_midnight} ] },
551             ],
552             [
553             { 1 => [ $flag{last_this_next} ] },
554             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
555             ],
556             ],
557             [ {}, {} ],
558             [ '_daytime', '_count_day_variant_week' ],
559             { truncate_to => [undef, q(hour)] },
560             ],
561             [
562             { 0 => qr/^(midnight)$/i, 1 => qr/^(next)$/i, 2 => $RE{weekday} },
563             [],
564             [],
565             [
566             [
567             { 0 => [ $flag{noon_midnight} ] },
568             ],
569             [
570             { 1 => [ $flag{last_this_next} ] },
571             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
572             ],
573             ],
574             [ {}, {} ],
575             [ '_daytime', '_count_day_variant_week' ],
576             { truncate_to => [undef, q(hour)] },
577             ],
578             [
579             { 0 => qr/^(noon)$/i, 1 => qr/^(this)$/i, 2 => $RE{weekday} },
580             [],
581             [],
582             [
583             [
584             { 0 => [ $flag{noon_midnight} ] },
585             ],
586             [
587             { 1 => [ $flag{last_this_next} ] },
588             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
589             ],
590             ],
591             [ {}, {} ],
592             [ '_daytime', '_count_day_variant_week' ],
593             { truncate_to => [undef, q(hour)] },
594             ],
595             [
596             { 0 => qr/^(midnight)$/i, 1 => qr/^(this)$/i, 2 => $RE{weekday} },
597             [],
598             [],
599             [
600             [
601             { 0 => [ $flag{noon_midnight} ] },
602             ],
603             [
604             { 1 => [ $flag{last_this_next} ] },
605             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
606             ],
607             ],
608             [ {}, {} ],
609             [ '_daytime', '_count_day_variant_week' ],
610             { truncate_to => [undef, q(hour)] },
611             ],
612             [
613             { 0 => qr/^(noon)$/i, 1 => qr/^(last)$/i, 2 => $RE{weekday} },
614             [],
615             [],
616             [
617             [
618             { 0 => [ $flag{noon_midnight} ] },
619             ],
620             [
621             { 1 => [ $flag{last_this_next} ] },
622             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
623             ],
624             ],
625             [ {}, {} ],
626             [ '_daytime', '_count_day_variant_week' ],
627             { truncate_to => [undef, q(hour)] },
628             ],
629             [
630             { 0 => qr/^(midnight)$/i, 1 => qr/^(last)$/i, 2 => $RE{weekday} },
631             [],
632             [],
633             [
634             [
635             { 0 => [ $flag{noon_midnight} ] },
636             ],
637             [
638             { 1 => [ $flag{last_this_next} ] },
639             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
640             ],
641             ],
642             [ {}, {} ],
643             [ '_daytime', '_count_day_variant_week' ],
644             { truncate_to => [undef, q(hour)] },
645             ],
646             ],
647             this_daytime => [
648             [ 'SCALAR', 'REGEXP' ],
649             [
650             { 0 => 'this', 1 => qr/^(morning)$/i },
651             [],
652             [],
653             [
654             [
655             { 1 => [ $flag{morn_aftern_even} ] },
656             ],
657             ],
658             [ {} ],
659             [ '_daytime_variant' ],
660             { truncate_to => [q(hour)] },
661             ],
662             [
663             { 0 => 'this', 1 => qr/^(afternoon)$/i },
664             [],
665             [],
666             [
667             [
668             { 1 => [ $flag{morn_aftern_even} ] },
669             ]
670             ],
671             [ {} ],
672             [ '_daytime_variant' ],
673             { truncate_to => [q(hour)] },
674             ],
675             [
676             { 0 => 'this', 1 => qr/^(evening)$/i },
677             [],
678             [],
679             [
680             [
681             { 1 => [ $flag{morn_aftern_even} ] },
682             ],
683             ],
684             [ {} ],
685             [ '_daytime_variant' ],
686             { truncate_to => [q(hour)] },
687             ],
688             ],
689             daytime_day => [
690             [ 'REGEXP', 'REGEXP' ],
691             [
692             { 0 => qr/^(yesterday)$/i, 1 => qr/^(morning)$/i },
693             [],
694             [],
695             [
696             [
697             { 0 => [ $flag{yes_today_tom} ] },
698             ],
699             [
700             { 1 => [ $flag{morn_aftern_even} ] },
701             ],
702             ],
703             [ { unit => 'day' }, {} ],
704             [ '_unit_variant', '_daytime_variant' ],
705             { truncate_to => [undef, q(hour)] },
706             ],
707             [
708             { 0 => qr/^(yesterday)$/i, 1 => qr/^(afternoon)$/i },
709             [],
710             [],
711             [
712             [
713             { 0 => [ $flag{yes_today_tom} ] },
714             ],
715             [
716             { 1 => [ $flag{morn_aftern_even} ] },
717             ]
718             ],
719             [ { unit => 'day' }, {} ],
720             [ '_unit_variant', '_daytime_variant' ],
721             { truncate_to => [undef, q(hour)] },
722             ],
723             [
724             { 0 => qr/^(yesterday)$/i, 1 => qr/^(evening)$/i },
725             [],
726             [],
727             [
728             [
729             { 0 => [ $flag{yes_today_tom} ] },
730             ],
731             [
732             { 1 => [ $flag{morn_aftern_even} ] },
733             ],
734             ],
735             [ { unit => 'day' }, {} ],
736             [ '_unit_variant', '_daytime_variant' ],
737             { truncate_to => [undef, q(hour)] },
738             ],
739             [
740             { 0 => qr/^(today)$/i, 1 => qr/^(morning)$/i },
741             [],
742             [],
743             [
744             [
745             { 0 => [ $flag{yes_today_tom} ] },
746             ],
747             [
748             { 1 => [ $flag{morn_aftern_even} ] },
749             ]
750             ],
751             [ { unit => 'day' }, {} ],
752             [ '_unit_variant', '_daytime_variant' ],
753             { truncate_to => [undef, q(hour)] },
754             ],
755             [
756             { 0 => qr/^(today)$/i, 1 => qr/^(afternoon)$/i },
757             [],
758             [],
759             [
760             [
761             { 0 => [ $flag{yes_today_tom} ] },
762             ],
763             [
764             { 1 => [ $flag{morn_aftern_even} ] },
765             ],
766             ],
767             [ { unit => 'day' }, {} ],
768             [ '_unit_variant', '_daytime_variant' ],
769             { truncate_to => [undef, q(hour)] },
770             ],
771             [
772             { 0 => qr/^(today)$/i, 1 => qr/^(evening)$/i },
773             [],
774             [],
775             [
776             [
777             { 0 => [ $flag{yes_today_tom} ] },
778             ],
779             [
780             { 1 => [ $flag{morn_aftern_even} ] },
781             ],
782             ],
783             [ { unit => 'day' }, {} ],
784             [ '_unit_variant', '_daytime_variant' ],
785             { truncate_to => [undef, q(hour)] },
786             ],
787             [
788             { 0 => qr/^(tomorrow)$/i, 1 => qr/^(morning)$/i },
789             [],
790             [],
791             [
792             [
793             { 0 => [ $flag{yes_today_tom} ] },
794             ],
795             [
796             { 1 => [ $flag{morn_aftern_even} ] },
797             ]
798             ],
799             [ { unit => 'day' }, {} ],
800             [ '_unit_variant', '_daytime_variant' ],
801             { truncate_to => [undef, q(hour)] },
802             ],
803             [
804             { 0 => qr/^(tomorrow)$/i, 1 => qr/^(afternoon)$/i },
805             [],
806             [],
807             [
808             [
809             { 0 => [ $flag{yes_today_tom} ] },
810             ],
811             [
812             { 1 => [ $flag{morn_aftern_even} ] },
813             ],
814             ],
815             [ { unit => 'day' }, {} ],
816             [ '_unit_variant', '_daytime_variant' ],
817             { truncate_to => [undef, q(hour)] },
818             ],
819             [
820             { 0 => qr/^(tomorrow)$/i, 1 => qr/^(evening)$/i },
821             [],
822             [],
823             [
824             [
825             { 0 => [ $flag{yes_today_tom} ] },
826             ],
827             [
828             { 1 => [ $flag{morn_aftern_even} ] },
829             ]
830             ],
831             [ { unit => 'day' }, {} ],
832             [ '_unit_variant', '_daytime_variant' ],
833             { truncate_to => [undef, q(hour)] },
834             ],
835             ],
836             weekday_daytime => [
837             [ 'REGEXP', 'REGEXP' ],
838             [
839             { 0 => $RE{weekday}, 1 => qr/^(morning)$/i },
840             [],
841             [],
842             [
843             [
844             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
845             ],
846             [
847             { 1 => [ $flag{morn_aftern_even} ] },
848             ]
849             ],
850             [ {}, {} ],
851             [ '_weekday', '_daytime_variant' ],
852             {
853             advance_future => true,
854             truncate_to => [undef, q(hour)],
855             },
856             ],
857             [
858             { 0 => $RE{weekday}, 1 => qr/^(afternoon)$/i },
859             [],
860             [],
861             [
862             [
863             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
864             ],
865             [
866             { 1 => [ $flag{morn_aftern_even} ] },
867             ],
868             ],
869             [ {}, {} ],
870             [ '_weekday', '_daytime_variant' ],
871             {
872             advance_future => true,
873             truncate_to => [undef, q(hour)],
874             },
875             ],
876             [
877             { 0 => $RE{weekday}, 1 => qr/^(evening)$/i },
878             [],
879             [],
880             [
881             [
882             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
883             ],
884             [
885             { 1 => [ $flag{morn_aftern_even} ] },
886             ]
887             ],
888             [ {}, {} ],
889             [ '_weekday', '_daytime_variant' ],
890             {
891             advance_future => true,
892             truncate_to => [undef, q(hour)],
893             },
894             ],
895             ],
896             at_daytime => [
897             [ 'REGEXP', 'REGEXP' ],
898             [
899             { 0 => $RE{time}, 1 => qr/^(yesterday)$/i },
900             [],
901             [],
902             [
903             [ 0 ],
904             [
905             { 1 => [ $flag{yes_today_tom} ] },
906             ],
907             ],
908             [ {}, { unit => 'day' } ],
909             [ '_time', '_unit_variant' ],
910             { truncate_to => [undef, q(hour_minute_second)] },
911             ],
912             [
913             { 0 => $RE{time}, 1 => qr/^(today)$/i },
914             [],
915             [],
916             [
917             [ 0 ],
918             [
919             { 1 => [ $flag{yes_today_tom} ] },
920             ],
921             ],
922             [ {}, { unit => 'day' } ],
923             [ '_time', '_unit_variant' ],
924             { truncate_to => [undef, q(hour_minute_second)] },
925             ],
926             [
927             { 0 => $RE{time}, 1 => qr/^(tomorrow)$/i },
928             [],
929             [],
930             [
931             [ 0 ],
932             [
933             { 1 => [ $flag{yes_today_tom} ] },
934             ],
935             ],
936             [ {}, { unit => 'day' } ],
937             [ '_time', '_unit_variant' ],
938             { truncate_to => [undef, q(hour_minute_second)] },
939             ],
940             [
941             { 0 => $RE{time_am}, 1 => qr/^(yesterday)$/i },
942             [ [ 0 ] ],
943             [ $extended_checks{meridiem} ],
944             [
945             [
946             { 0 => [ $flag{time_am} ] },
947             ],
948             [
949             { 1 => [ $flag{yes_today_tom} ] },
950             ],
951             ],
952             [ {}, { unit => 'day' } ],
953             [ '_at', '_unit_variant' ],
954             { truncate_to => [undef, q(hour_minute_second)] },
955             ],
956             [
957             { 0 => $RE{time_am}, 1 => qr/^(today)$/i },
958             [ [ 0 ] ],
959             [ $extended_checks{meridiem} ],
960             [
961             [
962             { 0 => [ $flag{time_am} ] },
963             ],
964             [
965             { 1 => [ $flag{yes_today_tom} ] },
966             ],
967             ],
968             [ {}, { unit => 'day' } ],
969             [ '_at', '_unit_variant' ],
970             { truncate_to => [undef, q(hour_minute_second)] },
971             ],
972             [
973             { 0 => $RE{time_am}, 1 => qr/^(tomorrow)$/i },
974             [ [ 0 ] ],
975             [ $extended_checks{meridiem} ],
976             [
977             [
978             { 0 => [ $flag{time_am} ] },
979             ],
980             [
981             { 1 => [ $flag{yes_today_tom} ] },
982             ],
983             ],
984             [ {}, { unit => 'day' } ],
985             [ '_at', '_unit_variant' ],
986             { truncate_to => [undef, q(hour_minute_second)] },
987             ],
988             [
989             { 0 => $RE{time_pm}, 1 => qr/^(yesterday)$/i },
990             [ [ 0 ] ],
991             [ $extended_checks{meridiem} ],
992             [
993             [
994             { 0 => [ $flag{time_pm} ] },
995             ],
996             [
997             { 1 => [ $flag{yes_today_tom} ] },
998             ],
999             ],
1000             [ {}, { unit => 'day' } ],
1001             [ '_at', '_unit_variant' ],
1002             { truncate_to => [undef, q(hour_minute_second)] },
1003             ],
1004             [
1005             { 0 => $RE{time_pm}, 1 => qr/^(today)$/i },
1006             [ [ 0 ] ],
1007             [ $extended_checks{meridiem} ],
1008             [
1009             [
1010             { 0 => [ $flag{time_pm} ] },
1011             ],
1012             [
1013             { 1 => [ $flag{yes_today_tom} ] },
1014             ],
1015             ],
1016             [ {}, { unit => 'day' } ],
1017             [ '_at', '_unit_variant' ],
1018             { truncate_to => [undef, q(hour_minute_second)] },
1019             ],
1020             [
1021             { 0 => $RE{time_pm}, 1 => qr/^(tomorrow)$/i },
1022             [ [ 0 ] ],
1023             [ $extended_checks{meridiem} ],
1024             [
1025             [
1026             { 0 => [ $flag{time_pm} ] },
1027             ],
1028             [
1029             { 1 => [ $flag{yes_today_tom} ] },
1030             ],
1031             ],
1032             [ {}, { unit => 'day' } ],
1033             [ '_at', '_unit_variant' ],
1034             { truncate_to => [undef, q(hour_minute_second)] },
1035             ],
1036             ],
1037             at_variant_weekday => [
1038             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1039             [
1040             { 0 => $RE{time}, 1 => qr/^(next)$/i, 2 => $RE{weekday} },
1041             [],
1042             [],
1043             [
1044             [ 0 ],
1045             [
1046             { 1 => [ $flag{last_this_next} ] },
1047             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1048             ],
1049             ],
1050             [ {}, {} ],
1051             [ '_time', '_count_day_variant_week' ],
1052             { truncate_to => [undef, q(hour_minute_second)] },
1053             ],
1054             [
1055             { 0 => $RE{time}, 1 => qr/^(this)$/i, 2 => $RE{weekday} },
1056             [],
1057             [],
1058             [
1059             [ 0 ],
1060             [
1061             { 1 => [ $flag{last_this_next} ] },
1062             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1063             ],
1064             ],
1065             [ {}, {} ],
1066             [ '_time', '_count_day_variant_week' ],
1067             { truncate_to => [undef, q(hour_minute_second)] },
1068             ],
1069             [
1070             { 0 => $RE{time}, 1 => qr/^(last)$/i, 2 => $RE{weekday} },
1071             [],
1072             [],
1073             [
1074             [ 0 ],
1075             [
1076             { 1 => [ $flag{last_this_next} ] },
1077             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1078             ],
1079             ],
1080             [ {}, {} ],
1081             [ '_time', '_count_day_variant_week' ],
1082             { truncate_to => [undef, q(hour_minute_second)] },
1083             ],
1084             [
1085             { 0 => $RE{time_am}, 1 => qr/^(next)$/i, 2 => $RE{weekday} },
1086             [ [ 0 ] ],
1087             [ $extended_checks{meridiem} ],
1088             [
1089             [
1090             { 0 => [ $flag{time_am} ] },
1091             ],
1092             [
1093             { 1 => [ $flag{last_this_next} ] },
1094             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1095             ],
1096             ],
1097             [ {}, {} ],
1098             [ '_at', '_count_day_variant_week' ],
1099             { truncate_to => [undef, q(hour_minute_second)] },
1100             ],
1101             [
1102             { 0 => $RE{time_am}, 1 => qr/^(this)$/i, 2 => $RE{weekday} },
1103             [ [ 0 ] ],
1104             [ $extended_checks{meridiem} ],
1105             [
1106             [
1107             { 0 => [ $flag{time_am} ] },
1108             ],
1109             [
1110             { 1 => [ $flag{last_this_next} ] },
1111             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1112             ],
1113             ],
1114             [ {}, {} ],
1115             [ '_at', '_count_day_variant_week' ],
1116             { truncate_to => [undef, q(hour_minute_second)] },
1117             ],
1118             [
1119             { 0 => $RE{time_am}, 1 => qr/^(last)$/i, 2 => $RE{weekday} },
1120             [ [ 0 ] ],
1121             [ $extended_checks{meridiem} ],
1122             [
1123             [
1124             { 0 => [ $flag{time_am} ] },
1125             ],
1126             [
1127             { 1 => [ $flag{last_this_next} ] },
1128             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1129             ],
1130             ],
1131             [ {}, {} ],
1132             [ '_at', '_count_day_variant_week' ],
1133             { truncate_to => [undef, q(hour_minute_second)] },
1134             ],
1135             [
1136             { 0 => $RE{time_pm}, 1 => qr/^(next)$/i, 2 => $RE{weekday} },
1137             [ [ 0 ] ],
1138             [ $extended_checks{meridiem} ],
1139             [
1140             [
1141             { 0 => [ $flag{time_pm} ] },
1142             ],
1143             [
1144             { 1 => [ $flag{last_this_next} ] },
1145             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1146             ],
1147             ],
1148             [ {}, {} ],
1149             [ '_at', '_count_day_variant_week' ],
1150             { truncate_to => [undef, q(hour_minute_second)] },
1151             ],
1152             [
1153             { 0 => $RE{time_pm}, 1 => qr/^(this)$/i, 2 => $RE{weekday} },
1154             [ [ 0 ] ],
1155             [ $extended_checks{meridiem} ],
1156             [
1157             [
1158             { 0 => [ $flag{time_pm} ] },
1159             ],
1160             [
1161             { 1 => [ $flag{last_this_next} ] },
1162             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1163             ],
1164             ],
1165             [ {}, {} ],
1166             [ '_at', '_count_day_variant_week' ],
1167             { truncate_to => [undef, q(hour_minute_second)] },
1168             ],
1169             [
1170             { 0 => $RE{time_pm}, 1 => qr/^(last)$/i, 2 => $RE{weekday} },
1171             [ [ 0 ] ],
1172             [ $extended_checks{meridiem} ],
1173             [
1174             [
1175             { 0 => [ $flag{time_pm} ] },
1176             ],
1177             [
1178             { 1 => [ $flag{last_this_next} ] },
1179             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1180             ],
1181             ],
1182             [ {}, {} ],
1183             [ '_at', '_count_day_variant_week' ],
1184             { truncate_to => [undef, q(hour_minute_second)] },
1185             ],
1186             ],
1187             variant_weekday_at => [
1188             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1189             [
1190             { 0 => qr/^(last)$/i, 1 => $RE{weekday}, 2 => $RE{time_am} },
1191             [ [ 2 ] ],
1192             [ $extended_checks{meridiem} ],
1193             [
1194             [
1195             { 0 => [ $flag{last_this_next} ] },
1196             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1197             ],
1198             [
1199             { 2 => [ $flag{time_am} ] },
1200             ],
1201             ],
1202             [ {}, {} ],
1203             [ '_count_day_variant_week', '_at' ],
1204             { truncate_to => [undef, q(hour_minute_second)] },
1205             ],
1206             [
1207             { 0 => qr/^(this)$/i, 1 => $RE{weekday}, 2 => $RE{time_am} },
1208             [ [ 2 ] ],
1209             [ $extended_checks{meridiem} ],
1210             [
1211             [
1212             { 0 => [ $flag{last_this_next} ] },
1213             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1214             ],
1215             [
1216             { 2 => [ $flag{time_am} ] },
1217             ],
1218             ],
1219             [ {}, {} ],
1220             [ '_count_day_variant_week', '_at' ],
1221             { truncate_to => [undef, q(hour_minute_second)] },
1222             ],
1223             [
1224             { 0 => qr/^(next)$/i, 1 => $RE{weekday}, 2 => $RE{time_am} },
1225             [ [ 2 ] ],
1226             [ $extended_checks{meridiem} ],
1227             [
1228             [
1229             { 0 => [ $flag{last_this_next} ] },
1230             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1231             ],
1232             [
1233             { 2 => [ $flag{time_am} ] },
1234             ],
1235             ],
1236             [ {}, {} ],
1237             [ '_count_day_variant_week', '_at' ],
1238             { truncate_to => [undef, q(hour_minute_second)] },
1239             ],
1240             [
1241             { 0 => qr/^(last)$/i, 1 => $RE{weekday}, 2 => $RE{time_pm} },
1242             [ [ 2 ] ],
1243             [ $extended_checks{meridiem} ],
1244             [
1245             [
1246             { 0 => [ $flag{last_this_next} ] },
1247             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1248             ],
1249             [
1250             { 2 => [ $flag{time_pm} ] },
1251             ],
1252             ],
1253             [ {}, {} ],
1254             [ '_count_day_variant_week', '_at' ],
1255             { truncate_to => [undef, q(hour_minute_second)] },
1256             ],
1257             [
1258             { 0 => qr/^(this)$/i, 1 => $RE{weekday}, 2 => $RE{time_pm} },
1259             [ [ 2 ] ],
1260             [ $extended_checks{meridiem} ],
1261             [
1262             [
1263             { 0 => [ $flag{last_this_next} ] },
1264             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1265             ],
1266             [
1267             { 2 => [ $flag{time_pm} ] },
1268             ],
1269             ],
1270             [ {}, {} ],
1271             [ '_count_day_variant_week', '_at' ],
1272             { truncate_to => [undef, q(hour_minute_second)] },
1273             ],
1274             [
1275             { 0 => qr/^(next)$/i, 1 => $RE{weekday}, 2 => $RE{time_pm} },
1276             [ [ 2 ] ],
1277             [ $extended_checks{meridiem} ],
1278             [
1279             [
1280             { 0 => [ $flag{last_this_next} ] },
1281             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1282             ],
1283             [
1284             { 2 => [ $flag{time_pm} ] },
1285             ],
1286             ],
1287             [ {}, {} ],
1288             [ '_count_day_variant_week', '_at' ],
1289             { truncate_to => [undef, q(hour_minute_second)] },
1290             ],
1291             ],
1292             month => [
1293             [ 'REGEXP' ],
1294             [
1295             { 0 => $RE{month} },
1296             [],
1297             [],
1298             [
1299             [
1300             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1301             ],
1302             ],
1303             [ { unit => 'month' } ],
1304             [ '_unit_date' ],
1305             {
1306             advance_future => true,
1307             truncate_to => [q(month)],
1308             },
1309             ],
1310             ],
1311             month_day => [
1312             [ 'REGEXP', 'REGEXP' ],
1313             [
1314             { 0 => $RE{monthday}, 1 => $RE{month} },
1315             [ [ 0 ] ],
1316             [ $extended_checks{ordinal} ],
1317             [
1318             [
1319             0,
1320             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1321             ],
1322             ],
1323             [ {} ],
1324             [ '_month_day' ],
1325             {
1326             advance_future => true,
1327             truncate_to => [q(day)],
1328             },
1329             ],
1330             [
1331             { 0 => $RE{month}, 1 => $RE{monthday} },
1332             [ [ 1 ] ],
1333             [ $extended_checks{ordinal} ],
1334             [
1335             [
1336             1,
1337             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1338             ],
1339             ],
1340             [ {} ],
1341             [ '_month_day' ],
1342             {
1343             advance_future => true,
1344             truncate_to => [q(day)],
1345             },
1346             ]
1347             ],
1348             month_day_at => [
1349             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1350             [
1351             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{time_min} },
1352             [ [ 1 ] ],
1353             [ $extended_checks{ordinal} ],
1354             [
1355             [
1356             1,
1357             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1358             ],
1359             [ 2 ],
1360             ],
1361             [ {}, {} ],
1362             [ '_month_day', '_time' ],
1363             { truncate_to => [undef, q(minute_second)] },
1364             ],
1365             [
1366             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{time_am} },
1367             [ [ 1 ], [ 2 ] ],
1368             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1369             [
1370             [
1371             1,
1372             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1373             ],
1374             [
1375             { 2 => [ $flag{time_am} ] },
1376             ],
1377             ],
1378             [ {}, {} ],
1379             [ '_month_day', '_at' ],
1380             { truncate_to => [undef, q(hour_minute_second)] },
1381             ],
1382             [
1383             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{time_pm} },
1384             [ [ 1 ], [ 2 ] ],
1385             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1386             [
1387             [
1388             1,
1389             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1390             ],
1391             [
1392             { 2 => [ $flag{time_pm} ] },
1393             ],
1394             ],
1395             [ {}, {} ],
1396             [ '_month_day', '_at' ],
1397             { truncate_to => [undef, q(hour_minute_second)] },
1398             ],
1399             ],
1400             month_day_year_at => [
1401             [ 'REGEXP', 'REGEXP', 'REGEXP', 'REGEXP' ],
1402             [
1403             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{year}, 3 => $RE{time_min} },
1404             [ [ 1 ] ],
1405             [ $extended_checks{ordinal} ],
1406             [
1407             [
1408             1,
1409             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1410             ],
1411             [ 2 ],
1412             [ 3 ],
1413             ],
1414             [ {}, { unit => 'year' }, {} ],
1415             [ '_month_day', '_unit_date', '_time' ],
1416             { truncate_to => [undef, undef, q(minute_second)] },
1417             ],
1418             [
1419             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{year}, 3 => $RE{time_am} },
1420             [ [ 1 ], [ 3 ] ],
1421             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1422             [
1423             [
1424             1,
1425             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1426             ],
1427             [ 2 ],
1428             [
1429             { 3 => [ $flag{time_am} ] },
1430             ],
1431             ],
1432             [ {}, { unit => 'year' }, {} ],
1433             [ '_month_day', '_unit_date', '_at' ],
1434             { truncate_to => [undef, undef, q(hour_minute_second)] },
1435             ],
1436             [
1437             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{year}, 3 => $RE{time_pm} },
1438             [ [ 1 ], [ 3 ] ],
1439             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1440             [
1441             [
1442             1,
1443             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1444             ],
1445             [ 2 ],
1446             [
1447             { 3 => [ $flag{time_pm} ] },
1448             ],
1449             ],
1450             [ {}, { unit => 'year' }, {} ],
1451             [ '_month_day', '_unit_date', '_at' ],
1452             { truncate_to => [undef, undef, q(hour_minute_second)] },
1453             ],
1454             ],
1455             day_month_at => [
1456             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1457             [
1458             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{time_min} },
1459             [ [ 0 ] ],
1460             [ $extended_checks{ordinal} ],
1461             [
1462             [
1463             0,
1464             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1465             ],
1466             [ 2 ],
1467             ],
1468             [ {}, {} ],
1469             [ '_month_day', '_time' ],
1470             { truncate_to => [undef, q(minute_second)] },
1471             ],
1472             [
1473             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{time_am} },
1474             [ [ 0 ], [ 2 ] ],
1475             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1476             [
1477             [
1478             0,
1479             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1480             ],
1481             [
1482             { 2 => [ $flag{time_am} ] },
1483             ],
1484             ],
1485             [ {}, {} ],
1486             [ '_month_day', '_at' ],
1487             { truncate_to => [undef, q(hour_minute_second)] },
1488             ],
1489             [
1490             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{time_pm} },
1491             [ [ 0 ], [ 2 ] ],
1492             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1493             [
1494             [
1495             0,
1496             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1497             ],
1498             [
1499             { 2 => [ $flag{time_pm} ] },
1500             ],
1501             ],
1502             [ {}, {} ],
1503             [ '_month_day', '_at' ],
1504             { truncate_to => [undef, q(hour_minute_second)] },
1505             ],
1506             ],
1507             day_month_year_at => [
1508             [ 'REGEXP', 'REGEXP', 'REGEXP', 'REGEXP' ],
1509             [
1510             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{year}, 3 => $RE{time_min} },
1511             [ [ 0 ] ],
1512             [ $extended_checks{ordinal} ],
1513             [
1514             [
1515             0,
1516             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1517             ],
1518             [ 2 ],
1519             [ 3 ],
1520             ],
1521             [ {}, { unit => 'year' }, {} ],
1522             [ '_month_day', '_unit_date', '_time' ],
1523             { truncate_to => [undef, undef, q(minute_second)] },
1524             ],
1525             [
1526             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{year}, 3 => $RE{time_am} },
1527             [ [ 0 ], [ 3 ] ],
1528             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1529             [
1530             [
1531             0,
1532             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1533             ],
1534             [ 2 ],
1535             [
1536             { 3 => [ $flag{time_am} ] },
1537             ],
1538             ],
1539             [ {}, { unit => 'year' }, {} ],
1540             [ '_month_day', '_unit_date', '_at' ],
1541             { truncate_to => [undef, undef, q(hour_minute_second)] },
1542             ],
1543             [
1544             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{year}, 3 => $RE{time_pm} },
1545             [ [ 0 ], [ 3 ] ],
1546             [ $extended_checks{ordinal}, $extended_checks{meridiem} ],
1547             [
1548             [
1549             0,
1550             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1551             ],
1552             [ 2 ],
1553             [
1554             { 3 => [ $flag{time_pm} ] },
1555             ],
1556             ],
1557             [ {}, { unit => 'year' }, {} ],
1558             [ '_month_day', '_unit_date', '_at' ],
1559             { truncate_to => [undef, undef, q(hour_minute_second)] },
1560             ],
1561             ],
1562             at_month_day => [
1563             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1564             [
1565             { 0 => $RE{time_min}, 1 => $RE{month}, 2 => $RE{monthday} },
1566             [ [ 2 ] ],
1567             [ $extended_checks{ordinal} ],
1568             [
1569             [ 0 ],
1570             [
1571             2,
1572             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1573             ],
1574             ],
1575             [ {}, {} ],
1576             [ '_time', '_month_day' ],
1577             { truncate_to => [undef, q(minute_second)] },
1578             ],
1579             [
1580             { 0 => $RE{time_am}, 1 => $RE{month}, 2 => $RE{monthday} },
1581             [ [ 0 ], [ 2 ] ],
1582             [ $extended_checks{meridiem}, $extended_checks{ordinal} ],
1583             [
1584             [
1585             { 0 => [ $flag{time_am} ] },
1586             ],
1587             [
1588             2,
1589             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1590             ],
1591             ],
1592             [ {}, {} ],
1593             [ '_at', '_month_day' ],
1594             { truncate_to => [undef, q(hour_minute_second)] },
1595             ],
1596             [
1597             { 0 => $RE{time_pm}, 1 => $RE{month}, 2 => $RE{monthday} },
1598             [ [ 0 ], [ 2 ] ],
1599             [ $extended_checks{meridiem}, $extended_checks{ordinal} ],
1600             [
1601             [
1602             { 0 => [ $flag{time_pm} ] },
1603             ],
1604             [
1605             2,
1606             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1607             ],
1608             ],
1609             [ {}, {} ],
1610             [ '_at', '_month_day' ],
1611             { truncate_to => [undef, q(hour_minute_second)] },
1612             ],
1613             ],
1614             day_month_year_ago => [
1615             [ 'REGEXP', 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
1616             [
1617             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{number}, 3 => qr/^(years?)$/i, 4 => 'ago' },
1618             [ [ 0 ], [ 2, 3 ] ],
1619             [ $extended_checks{ordinal}, $extended_checks{suffix} ],
1620             [
1621             [
1622             0,
1623             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1624             ],
1625             [ 2 ],
1626             ],
1627             [ {}, { unit => 'year' } ],
1628             [ '_month_day', '_ago_variant' ],
1629             { truncate_to => [undef, q(day)] },
1630             ],
1631             ],
1632             day_month_variant_year => [
1633             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
1634             [
1635             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => qr/^(next)$/i, 3 => 'year' },
1636             [ [ 0 ] ],
1637             [ $extended_checks{ordinal} ],
1638             [
1639             [
1640             0,
1641             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1642             ],
1643             [
1644             { 2 => [ $flag{last_this_next} ] },
1645             ],
1646             ],
1647             [ {}, { unit => 'year' } ],
1648             [ '_month_day', '_unit_variant' ],
1649             { truncate_to => [undef, q(day)] },
1650             ],
1651             [
1652             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => qr/^(this)$/i, 3 => 'year' },
1653             [ [ 0 ] ],
1654             [ $extended_checks{ordinal} ],
1655             [
1656             [
1657             0,
1658             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1659             ],
1660             [
1661             { 2 => [ $flag{last_this_next} ] },
1662             ],
1663             ],
1664             [ {}, { unit => 'year' } ],
1665             [ '_month_day', '_unit_variant' ],
1666             { truncate_to => [undef, q(day)] },
1667             ],
1668             [
1669             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => qr/^(last)$/i, 3 => 'year' },
1670             [ [ 0 ] ],
1671             [ $extended_checks{ordinal} ],
1672             [
1673             [
1674             0,
1675             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1676             ],
1677             [
1678             { 2 => [ $flag{last_this_next} ] },
1679             ]
1680             ],
1681             [ {}, { unit => 'year' } ],
1682             [ '_month_day', '_unit_variant' ],
1683             { truncate_to => [undef, q(day)] },
1684             ],
1685             ],
1686             month_day_year => [
1687             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1688             [
1689             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{year} },
1690             [ [ 1 ] ],
1691             [ $extended_checks{ordinal} ],
1692             [
1693             [
1694             1,
1695             { 0 => [ $flag{month_name}, $flag{month_num} ] },
1696             ],
1697             [ 2 ],
1698             ],
1699             [ {}, { unit => 'year' } ],
1700             [ '_month_day', '_unit_date' ],
1701             { truncate_to => [undef, q(day)] },
1702             ],
1703             ],
1704             year_month_day => [
1705             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
1706             [
1707             { 0 => $RE{year}, 1 => $RE{month}, 2 => $RE{monthday} },
1708             [ [ 2 ] ],
1709             [ $extended_checks{ordinal} ],
1710             [
1711             [ 0 ],
1712             [
1713             2,
1714             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1715             ],
1716             ],
1717             [ { unit => 'year' }, {} ],
1718             [ '_unit_date', '_month_day' ],
1719             { truncate_to => [undef, q(day)] },
1720             ],
1721             ],
1722             week_variant => [
1723             [ 'REGEXP', 'SCALAR' ],
1724             [
1725             { 0 => qr/^(next)$/i, 1 => 'week' },
1726             [],
1727             [],
1728             [
1729             [
1730             { 0 => [ $flag{last_this_next} ] },
1731             ],
1732             ],
1733             [ { unit => 'week' } ],
1734             [ '_unit_variant' ],
1735             { truncate_to => [q(day)] },
1736             ],
1737             [
1738             { 0 => qr/^(this)$/i, 1 => 'week' },
1739             [],
1740             [],
1741             [
1742             [
1743             { 0 => [ $flag{last_this_next} ] },
1744             ],
1745             ],
1746             [ { unit => 'week' } ],
1747             [ '_unit_variant' ],
1748             { truncate_to => [q(day)] },
1749             ],
1750             [
1751             { 0 => qr/^(last)$/i, 1 => 'week' },
1752             [],
1753             [],
1754             [
1755             [
1756             { 0 => [ $flag{last_this_next} ] },
1757             ]
1758             ],
1759             [ { unit => 'week' } ],
1760             [ '_unit_variant' ],
1761             { truncate_to => [q(day)] },
1762             ]
1763             ],
1764             weekday => [
1765             [ 'REGEXP' ],
1766             [
1767             { 0 => $RE{weekday} },
1768             [],
1769             [],
1770             [
1771             [
1772             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1773             ]
1774             ],
1775             [ {} ],
1776             [ '_weekday' ],
1777             {
1778             advance_future => true,
1779             truncate_to => [q(day)],
1780             },
1781             ],
1782             ],
1783             weekday_variant => [
1784             [ 'REGEXP', 'REGEXP' ],
1785             [
1786             { 0 => qr/^(next)$/i, 1 => $RE{weekday} },
1787             [],
1788             [],
1789             [
1790             [
1791             { 0 => [ $flag{last_this_next} ] },
1792             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1793             ],
1794             ],
1795             [ {} ],
1796             [ '_count_day_variant_week' ],
1797             { truncate_to => [q(day)] },
1798             ],
1799             [
1800             { 0 => qr/^(this)$/i, 1 => $RE{weekday} },
1801             [],
1802             [],
1803             [
1804             [
1805             { 0 => [ $flag{last_this_next} ] },
1806             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1807             ],
1808             ],
1809             [ {} ],
1810             [ '_count_day_variant_week' ],
1811             { truncate_to => [q(day)] },
1812             ],
1813             [
1814             { 0 => qr/^(last)$/i, 1 => $RE{weekday} },
1815             [],
1816             [],
1817             [
1818             [
1819             { 0 => [ $flag{last_this_next} ] },
1820             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
1821             ],
1822             ],
1823             [ {} ],
1824             [ '_count_day_variant_week' ],
1825             { truncate_to => [q(day)] },
1826             ],
1827             ],
1828             year_variant => [
1829             [ 'REGEXP', 'SCALAR' ],
1830             [
1831             { 0 => qr/^(last)$/i, 1 => 'year' },
1832             [],
1833             [],
1834             [
1835             [
1836             { 0 => [ $flag{last_this_next} ] },
1837             ],
1838             ],
1839             [ { unit => 'year' } ],
1840             [ '_unit_variant' ],
1841             { truncate_to => [q(year)] },
1842             ],
1843             [
1844             { 0 => qr/^(this)$/i, 1 => 'year' },
1845             [],
1846             [],
1847             [
1848             [
1849             { 0 => [ $flag{last_this_next} ] },
1850             ],
1851             ],
1852             [ { unit => 'year' } ],
1853             [ '_unit_variant' ],
1854             { truncate_to => [q(year)] },
1855             ],
1856             [
1857             { 0 => qr/^(next)$/i, 1 => 'year' },
1858             [],
1859             [],
1860             [
1861             [
1862             { 0 => [ $flag{last_this_next} ] },
1863             ],
1864             ],
1865             [ { unit => 'year' } ],
1866             [ '_unit_variant' ],
1867             { truncate_to => [q(year)] }
1868             ],
1869             ],
1870             month_variant => [
1871             [ 'REGEXP', 'REGEXP' ],
1872             [
1873             { 0 => qr/^(last)$/i, 1 => $RE{month} },
1874             [],
1875             [],
1876             [
1877             [
1878             { 0 => [ $flag{last_this_next} ] },
1879             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1880             ],
1881             ],
1882             [ {} ],
1883             [ '_month_variant' ],
1884             { truncate_to => [q(month)] },
1885             ],
1886             [
1887             { 0 => qr/^(this)$/i, 1 => $RE{month} },
1888             [],
1889             [],
1890             [
1891             [
1892             { 0 => [ $flag{last_this_next} ] },
1893             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1894             ]
1895             ],
1896             [ {} ],
1897             [ '_month_variant' ],
1898             { truncate_to => [q(month)] },
1899             ],
1900             [
1901             { 0 => qr/^(next)$/i, 1 => $RE{month} },
1902             [],
1903             [],
1904             [
1905             [
1906             { 0 => [ $flag{last_this_next} ] },
1907             { 1 => [ $flag{month_name}, $flag{month_num} ] },
1908             ],
1909             ],
1910             [ {} ],
1911             [ '_month_variant' ],
1912             { truncate_to => [q(month)] },
1913             ],
1914             ],
1915             time_literal_variant => [
1916             [ 'REGEXP', 'SCALAR' ],
1917             [
1918             { 0 => qr/^(last)$/i, 1 => 'millisecond' },
1919             [],
1920             [],
1921             [
1922             [
1923             { 0 => [ $flag{last_this_next} ] },
1924             ],
1925             ],
1926             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
1927             [ '_unit_variant' ],
1928             {},
1929             ],
1930             [
1931             { 0 => qr/^(this)$/i, 1 => 'millisecond' },
1932             [],
1933             [],
1934             [
1935             [
1936             { 0 => [ $flag{last_this_next} ] },
1937             ],
1938             ],
1939             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
1940             [ '_unit_variant' ],
1941             {},
1942             ],
1943             [
1944             { 0 => qr/^(next)$/i, 1 => 'millisecond' },
1945             [],
1946             [],
1947             [
1948             [
1949             { 0 => [ $flag{last_this_next} ] },
1950             ],
1951             ],
1952             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
1953             [ '_unit_variant' ],
1954             {},
1955             ],
1956             [
1957             { 0 => qr/^(last)$/i, 1 => 'second' },
1958             [],
1959             [],
1960             [
1961             [
1962             { 0 => [ $flag{last_this_next} ] },
1963             ],
1964             ],
1965             [ { unit => 'second' } ],
1966             [ '_unit_variant' ],
1967             { truncate_to => [q(second)] },
1968             ],
1969             [
1970             { 0 => qr/^(this)$/i, 1 => 'second' },
1971             [],
1972             [],
1973             [
1974             [
1975             { 0 => [ $flag{last_this_next} ] },
1976             ],
1977             ],
1978             [ { unit => 'second' } ],
1979             [ '_unit_variant' ],
1980             { truncate_to => [q(second)] },
1981             ],
1982             [
1983             { 0 => qr/^(next)$/i, 1 => 'second' },
1984             [],
1985             [],
1986             [
1987             [
1988             { 0 => [ $flag{last_this_next} ] },
1989             ],
1990             ],
1991             [ { unit => 'second' } ],
1992             [ '_unit_variant' ],
1993             { truncate_to => [q(second)] },
1994             ],
1995             [
1996             { 0 => qr/^(last)$/i, 1 => 'minute' },
1997             [],
1998             [],
1999             [
2000             [
2001             { 0 => [ $flag{last_this_next} ] },
2002             ],
2003             ],
2004             [ { unit => 'minute' } ],
2005             [ '_unit_variant' ],
2006             { truncate_to => [q(minute)] },
2007             ],
2008             [
2009             { 0 => qr/^(this)$/i, 1 => 'minute' },
2010             [],
2011             [],
2012             [
2013             [
2014             { 0 => [ $flag{last_this_next} ] },
2015             ],
2016             ],
2017             [ { unit => 'minute' } ],
2018             [ '_unit_variant' ],
2019             { truncate_to => [q(minute)] },
2020             ],
2021             [
2022             { 0 => qr/^(next)$/i, 1 => 'minute' },
2023             [],
2024             [],
2025             [
2026             [
2027             { 0 => [ $flag{last_this_next} ] },
2028             ],
2029             ],
2030             [ { unit => 'minute' } ],
2031             [ '_unit_variant' ],
2032             { truncate_to => [q(minute)] },
2033             ],
2034             [
2035             { 0 => qr/^(last)$/i, 1 => 'hour' },
2036             [],
2037             [],
2038             [
2039             [
2040             { 0 => [ $flag{last_this_next} ] },
2041             ],
2042             ],
2043             [ { unit => 'hour' } ],
2044             [ '_unit_variant' ],
2045             { truncate_to => [q(hour)] },
2046             ],
2047             [
2048             { 0 => qr/^(this)$/i, 1 => 'hour' },
2049             [],
2050             [],
2051             [
2052             [
2053             { 0 => [ $flag{last_this_next} ] },
2054             ],
2055             ],
2056             [ { unit => 'hour' } ],
2057             [ '_unit_variant' ],
2058             { truncate_to => [q(hour)] },
2059             ],
2060             [
2061             { 0 => qr/^(next)$/i, 1 => 'hour' },
2062             [],
2063             [],
2064             [
2065             [
2066             { 0 => [ $flag{last_this_next} ] },
2067             ],
2068             ],
2069             [ { unit => 'hour' } ],
2070             [ '_unit_variant' ],
2071             { truncate_to => [q(hour)] },
2072             ],
2073             ],
2074             date_literal_variant => [
2075             [ 'REGEXP', 'SCALAR' ],
2076             [
2077             { 0 => qr/^(last)$/i, 1 => 'day' },
2078             [],
2079             [],
2080             [
2081             [
2082             { 0 => [ $flag{last_this_next} ] },
2083             ],
2084             ],
2085             [ { unit => 'day' } ],
2086             [ '_unit_variant' ],
2087             { truncate_to => [q(day)] },
2088             ],
2089             [
2090             { 0 => qr/^(this)$/i, 1 => 'day' },
2091             [],
2092             [],
2093             [
2094             [
2095             { 0 => [ $flag{last_this_next} ] },
2096             ],
2097             ],
2098             [ { unit => 'day' } ],
2099             [ '_unit_variant' ],
2100             { truncate_to => [q(day)] },
2101             ],
2102             [
2103             { 0 => qr/^(next)$/i, 1 => 'day' },
2104             [],
2105             [],
2106             [
2107             [
2108             { 0 => [ $flag{last_this_next} ] },
2109             ],
2110             ],
2111             [ { unit => 'day' } ],
2112             [ '_unit_variant' ],
2113             { truncate_to => [q(day)] },
2114             ],
2115             [
2116             { 0 => qr/^(last)$/i, 1 => 'month' },
2117             [],
2118             [],
2119             [
2120             [
2121             { 0 => [ $flag{last_this_next} ] },
2122             ],
2123             ],
2124             [ { unit => 'month' } ],
2125             [ '_unit_variant' ],
2126             { truncate_to => [q(month)] },
2127             ],
2128             [
2129             { 0 => qr/^(this)$/i, 1 => 'month' },
2130             [],
2131             [],
2132             [
2133             [
2134             { 0 => [ $flag{last_this_next} ] },
2135             ],
2136             ],
2137             [ { unit => 'month' } ],
2138             [ '_unit_variant' ],
2139             { truncate_to => [q(month)] },
2140             ],
2141             [
2142             { 0 => qr/^(next)$/i, 1 => 'month' },
2143             [],
2144             [],
2145             [
2146             [
2147             { 0 => [ $flag{last_this_next} ] },
2148             ],
2149             ],
2150             [ { unit => 'month' } ],
2151             [ '_unit_variant' ],
2152             { truncate_to => [q(month)] },
2153             ],
2154             ],
2155             at => [
2156             [ 'REGEXP' ],
2157             [
2158             { 0 => $RE{time_am} },
2159             [ [ 0 ] ],
2160             [ $extended_checks{meridiem} ],
2161             [
2162             [
2163             { 0 => [ $flag{time_am} ] },
2164             ],
2165             ],
2166             [ {} ],
2167             [ '_at' ],
2168             {
2169             advance_future => true,
2170             truncate_to => [q(hour_minute_second)],
2171             },
2172             ],
2173             [
2174             { 0 => $RE{time_pm} },
2175             [ [ 0 ] ],
2176             [ $extended_checks{meridiem} ],
2177             [
2178             [
2179             { 0 => [ $flag{time_pm} ] },
2180             ],
2181             ],
2182             [ {} ],
2183             [ '_at' ],
2184             {
2185             advance_future => true,
2186             truncate_to => [q(hour_minute_second)],
2187             },
2188             ],
2189             ],
2190             weekday_time => [
2191             [ 'REGEXP', 'REGEXP' ],
2192             [
2193             { 0 => $RE{weekday}, 1 => $RE{time} },
2194             [],
2195             [],
2196             [
2197             [
2198             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2199             ],
2200             [ 1 ],
2201             ],
2202             [ {}, {} ],
2203             [ '_weekday', '_time' ],
2204             {
2205             advance_future => true,
2206             truncate_to => [undef, q(hour_minute_second)],
2207             },
2208             ],
2209             [
2210             { 0 => $RE{weekday}, 1 => $RE{time_am} },
2211             [ [ 1 ] ],
2212             [ $extended_checks{meridiem} ],
2213             [
2214             [
2215             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2216             ],
2217             [
2218             { 1 => [ $flag{time_am} ] },
2219             ],
2220             ],
2221             [ {}, {} ],
2222             [ '_weekday', '_at' ],
2223             {
2224             advance_future => true,
2225             truncate_to => [undef, q(hour_minute_second)],
2226             },
2227             ],
2228             [
2229             { 0 => $RE{weekday}, 1 => $RE{time_pm} },
2230             [ [ 1 ] ],
2231             [ $extended_checks{meridiem} ],
2232             [
2233             [
2234             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2235             ],
2236             [
2237             { 1 => [ $flag{time_pm} ] },
2238             ],
2239             ],
2240             [ {}, {} ],
2241             [ '_weekday', '_at' ],
2242             {
2243             advance_future => true,
2244             truncate_to => [undef, q(hour_minute_second)],
2245             },
2246             ],
2247             [
2248             { 0 => $RE{time}, 1 => $RE{weekday} },
2249             [],
2250             [],
2251             [
2252             [ 0 ],
2253             [
2254             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2255             ],
2256             ],
2257             [ {}, {} ],
2258             [ '_time', '_weekday' ],
2259             {
2260             advance_future => true,
2261             truncate_to => [undef, q(hour_minute_second)],
2262             },
2263             ],
2264             [
2265             { 0 => $RE{time_am}, 1 => $RE{weekday} },
2266             [ [ 0 ] ],
2267             [ $extended_checks{meridiem} ],
2268             [
2269             [
2270             { 0 => [ $flag{time_am} ] },
2271             ],
2272             [
2273             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2274             ],
2275             ],
2276             [ {}, {} ],
2277             [ '_at', '_weekday' ],
2278             {
2279             advance_future => true,
2280             truncate_to => [undef, q(hour_minute_second)],
2281             },
2282             ],
2283             [
2284             { 0 => $RE{time_pm}, 1 => $RE{weekday} },
2285             [ [ 0 ] ],
2286             [ $extended_checks{meridiem} ],
2287             [
2288             [
2289             { 0 => [ $flag{time_pm} ] },
2290             ],
2291             [
2292             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2293             ],
2294             ],
2295             [ {}, {} ],
2296             [ '_at', '_weekday' ],
2297             {
2298             advance_future => true,
2299             truncate_to => [undef, q(hour_minute_second)],
2300             },
2301             ],
2302             ],
2303             time => [
2304             [ 'REGEXP' ],
2305             [
2306             { 0 => $RE{time} },
2307             [],
2308             [],
2309             [ [ 0 ] ],
2310             [ {} ],
2311             [ '_time' ],
2312             {
2313             advance_future => true,
2314             truncate_to => [q(hour_minute_second)],
2315             },
2316             ],
2317             ],
2318             month_year => [
2319             [ 'REGEXP', 'REGEXP' ],
2320             [
2321             { 0 => $RE{month}, 1 => $RE{year} },
2322             [],
2323             [],
2324             [
2325             [
2326             { 0 => [ $flag{month_name}, $flag{month_num} ] },
2327             ],
2328             [ 1 ],
2329             ],
2330             [ { unit => 'month' }, { unit => 'year' } ],
2331             [ '_unit_date', '_unit_date' ],
2332             { truncate_to => [undef, q(month)] },
2333             ],
2334             ],
2335             year => [
2336             [ 'REGEXP' ],
2337             [
2338             { 0 => $RE{year} },
2339             [],
2340             [],
2341             [ [ 0 ] ],
2342             [ { unit => 'year' } ],
2343             [ '_unit_date' ],
2344             { truncate_to => [q(year)] },
2345             ],
2346             ],
2347             count_weekday => [
2348             [ 'REGEXP', 'REGEXP' ],
2349             [
2350             { 0 => $RE{day}, 1 => $RE{weekday} },
2351             [ [ 0 ] ],
2352             [ $extended_checks{ordinal} ],
2353             [
2354             [
2355             0,
2356             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2357             ],
2358             ],
2359             [ {} ],
2360             [ '_count_weekday' ],
2361             {
2362             advance_future => true,
2363             truncate_to => [q(day)],
2364             },
2365             ],
2366             ],
2367             count_yearday => [
2368             [ 'REGEXP', 'SCALAR' ],
2369             [
2370             { 0 => $RE{day}, 1 => 'day' },
2371             [ [ 0 ] ],
2372             [ $extended_checks{ordinal} ],
2373             [
2374             [
2375             0,
2376             { VALUE => 0 }
2377             ],
2378             ],
2379             [ {} ],
2380             [ '_count_yearday_variant_year' ],
2381             { truncate_to => [q(day)] },
2382             ],
2383             ],
2384             count_yearday_variant_year => [
2385             [ 'REGEXP', 'SCALAR', 'REGEXP', 'SCALAR' ],
2386             [
2387             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(next)$/i, 3 => 'year' },
2388             [ [ 0 ] ],
2389             [ $extended_checks{ordinal} ],
2390             [
2391             [
2392             0,
2393             { 2 => [ $flag{last_this_next} ] },
2394             ],
2395             ],
2396             [ {} ],
2397             [ '_count_yearday_variant_year' ],
2398             { truncate_to => [q(day)] },
2399             ],
2400             [
2401             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(this)$/i, 3 => 'year' },
2402             [ [ 0 ] ],
2403             [ $extended_checks{ordinal} ],
2404             [
2405             [
2406             0,
2407             { 2 => [ $flag{last_this_next} ] },
2408             ],
2409             ],
2410             [ {} ],
2411             [ '_count_yearday_variant_year' ],
2412             { truncate_to => [q(day)] },
2413             ],
2414             [
2415             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(last)$/i, 3 => 'year' },
2416             [ [ 0 ] ],
2417             [ $extended_checks{ordinal} ],
2418             [
2419             [
2420             0,
2421             { 2 => [ $flag{last_this_next} ] },
2422             ],
2423             ],
2424             [ {} ],
2425             [ '_count_yearday_variant_year' ],
2426             { truncate_to => [q(day)] },
2427             ],
2428             ],
2429             daytime_in_the_variant => [
2430             [ 'REGEXP', 'SCALAR', 'SCALAR', 'SCALAR' ],
2431             [
2432             { 0 => $RE{number}, 1 => 'in', 2 => 'the', 3 => 'morning' },
2433             [],
2434             [],
2435             [ [ 0 ] ],
2436             [ {} ],
2437             [ '_daytime' ],
2438             { truncate_to => [q(hour)] },
2439             ],
2440             [
2441             { 0 => $RE{number}, 1 => 'in', 2 => 'the', 3 => 'afternoon' },
2442             [],
2443             [],
2444             [ [ 0 ] ],
2445             [ { hours => 12 } ],
2446             [ '_daytime' ],
2447             { truncate_to => [q(hour)] },
2448             ],
2449             [
2450             { 0 => $RE{number}, 1 => 'in', 2 => 'the', 3 => 'evening' },
2451             [],
2452             [],
2453             [ [ 0 ] ],
2454             [ { hours => 12 } ],
2455             [ '_daytime' ],
2456             { truncate_to => [q(hour)] },
2457             ],
2458             ],
2459             ago => [
2460             [ 'REGEXP', 'REGEXP', 'SCALAR' ],
2461             [
2462             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => 'ago' },
2463             [ [ 0, 1 ] ],
2464             [ $extended_checks{suffix} ],
2465             [ [ 0 ] ],
2466             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
2467             [ '_ago_variant' ],
2468             {},
2469             ],
2470             [
2471             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => 'ago' },
2472             [ [ 0, 1 ] ],
2473             [ $extended_checks{suffix} ],
2474             [ [ 0 ] ],
2475             [ { unit => 'second' } ],
2476             [ '_ago_variant' ],
2477             {},
2478             ],
2479             [
2480             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => 'ago' },
2481             [ [ 0, 1 ] ],
2482             [ $extended_checks{suffix} ],
2483             [ [ 0 ] ],
2484             [ { unit => 'minute' } ],
2485             [ '_ago_variant' ],
2486             {},
2487             ],
2488             [
2489             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => 'ago' },
2490             [ [ 0, 1 ] ],
2491             [ $extended_checks{suffix} ],
2492             [ [ 0 ] ],
2493             [ { unit => 'hour' } ],
2494             [ '_ago_variant' ],
2495             {},
2496             ],
2497             [
2498             { 0 => $RE{number}, 1 => qr/^(days?)$/i, 2 => 'ago' },
2499             [ [ 0, 1 ] ],
2500             [ $extended_checks{suffix} ],
2501             [ [ 0 ] ],
2502             [ { unit => 'day' } ],
2503             [ '_ago_variant' ],
2504             {},
2505             ],
2506             [
2507             { 0 => $RE{number}, 1 => qr/^(weeks?)$/i, 2 => 'ago' },
2508             [ [ 0, 1 ] ],
2509             [ $extended_checks{suffix} ],
2510             [ [ 0 ] ],
2511             [ { unit => 'week' } ],
2512             [ '_ago_variant' ],
2513             {},
2514             ],
2515             [
2516             { 0 => $RE{number}, 1 => qr/^(months?)$/i, 2 => 'ago' },
2517             [ [ 0, 1 ] ],
2518             [ $extended_checks{suffix} ],
2519             [ [ 0 ] ],
2520             [ { unit => 'month' } ],
2521             [ '_ago_variant' ],
2522             {},
2523             ],
2524             [
2525             { 0 => $RE{number}, 1 => qr/^(years?)$/i, 2 => 'ago' },
2526             [ [ 0, 1 ] ],
2527             [ $extended_checks{suffix} ],
2528             [ [ 0 ] ],
2529             [ { unit => 'year' } ],
2530             [ '_ago_variant' ],
2531             {},
2532             ],
2533             ],
2534             ago_tomorrow => [
2535             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
2536             [
2537             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(milliseconds?)$/i, 3 => 'ago' },
2538             [ [ 1, 2 ] ],
2539             [ $extended_checks{suffix} ],
2540             [
2541             [
2542             { 0 => [ $flag{yes_today_tom} ] },
2543             ],
2544             [ 1 ],
2545             ],
2546             [ { unit => 'day' }, { unit => 'nanosecond', multiply_by => milli_to_nano } ],
2547             [ '_unit_variant', '_ago_variant' ],
2548             {},
2549             ],
2550             [
2551             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(seconds?)$/i, 3 => 'ago' },
2552             [ [ 1, 2 ] ],
2553             [ $extended_checks{suffix} ],
2554             [
2555             [
2556             { 0 => [ $flag{yes_today_tom} ] },
2557             ],
2558             [ 1 ],
2559             ],
2560             [ { unit => 'day' }, { unit => 'second' } ],
2561             [ '_unit_variant', '_ago_variant' ],
2562             {},
2563             ],
2564             [
2565             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(minutes?)$/i, 3 => 'ago' },
2566             [ [ 1, 2 ] ],
2567             [ $extended_checks{suffix} ],
2568             [
2569             [
2570             { 0 => [ $flag{yes_today_tom} ] },
2571             ],
2572             [ 1 ],
2573             ],
2574             [ { unit => 'day' }, { unit => 'minute' } ],
2575             [ '_unit_variant', '_ago_variant' ],
2576             {},
2577             ],
2578             [
2579             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(hours?)$/i, 3 => 'ago' },
2580             [ [ 1, 2 ] ],
2581             [ $extended_checks{suffix} ],
2582             [
2583             [
2584             { 0 => [ $flag{yes_today_tom} ] },
2585             ],
2586             [ 1 ],
2587             ],
2588             [ { unit => 'day' }, { unit => 'hour' } ],
2589             [ '_unit_variant', '_ago_variant' ],
2590             {},
2591             ],
2592             [
2593             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(days?)$/i, 3 => 'ago' },
2594             [ [ 1, 2 ] ],
2595             [ $extended_checks{suffix} ],
2596             [
2597             [
2598             { 0 => [ $flag{yes_today_tom} ] },
2599             ],
2600             [ 1 ],
2601             ],
2602             [ { unit => 'day' }, { unit => 'day' } ],
2603             [ '_unit_variant', '_ago_variant' ],
2604             { truncate_to => [undef, q(day)] },
2605             ],
2606             [
2607             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(weeks?)$/i, 3 => 'ago' },
2608             [ [ 1, 2 ] ],
2609             [ $extended_checks{suffix} ],
2610             [
2611             [
2612             { 0 => [ $flag{yes_today_tom} ] },
2613             ],
2614             [ 1 ],
2615             ],
2616             [ { unit => 'day' }, { unit => 'week' } ],
2617             [ '_unit_variant', '_ago_variant' ],
2618             { truncate_to => [undef, q(day)] },
2619             ],
2620             [
2621             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago' },
2622             [ [ 1, 2 ] ],
2623             [ $extended_checks{suffix} ],
2624             [
2625             [
2626             { 0 => [ $flag{yes_today_tom} ] },
2627             ],
2628             [ 1 ],
2629             ],
2630             [ { unit => 'day' }, { unit => 'month' } ],
2631             [ '_unit_variant', '_ago_variant' ],
2632             { truncate_to => [undef, q(day)] },
2633             ],
2634             [
2635             { 0 => qr/^(tomorrow)$/i, 1 => $RE{number}, 2 => qr/^(years?)$/i, 3 => 'ago' },
2636             [ [ 1, 2 ] ],
2637             [ $extended_checks{suffix} ],
2638             [
2639             [
2640             { 0 => [ $flag{yes_today_tom} ] },
2641             ],
2642             [ 1 ],
2643             ],
2644             [ { unit => 'day' }, { unit => 'year' } ],
2645             [ '_unit_variant', '_ago_variant' ],
2646             { truncate_to => [undef, q(day)] },
2647             ],
2648             ],
2649             ago_today => [
2650             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
2651             [
2652             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(milliseconds?)$/i, 3 => 'ago' },
2653             [ [ 1, 2 ] ],
2654             [ $extended_checks{suffix} ],
2655             [
2656             [
2657             { 0 => [ $flag{yes_today_tom} ] },
2658             ],
2659             [ 1 ],
2660             ],
2661             [ { unit => 'day' }, { unit => 'nanosecond', multiply_by => milli_to_nano } ],
2662             [ '_unit_variant', '_ago_variant' ],
2663             {},
2664             ],
2665             [
2666             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(seconds?)$/i, 3 => 'ago' },
2667             [ [ 1, 2 ] ],
2668             [ $extended_checks{suffix} ],
2669             [
2670             [
2671             { 0 => [ $flag{yes_today_tom} ] },
2672             ],
2673             [ 1 ],
2674             ],
2675             [ { unit => 'day' }, { unit => 'second' } ],
2676             [ '_unit_variant', '_ago_variant' ],
2677             {},
2678             ],
2679             [
2680             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(minutes?)$/i, 3 => 'ago' },
2681             [ [ 1, 2 ] ],
2682             [ $extended_checks{suffix} ],
2683             [
2684             [
2685             { 0 => [ $flag{yes_today_tom} ] },
2686             ],
2687             [ 1 ],
2688             ],
2689             [ { unit => 'day' }, { unit => 'minute' } ],
2690             [ '_unit_variant', '_ago_variant' ],
2691             {},
2692             ],
2693             [
2694             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(hours?)$/i, 3 => 'ago' },
2695             [ [ 1, 2 ] ],
2696             [ $extended_checks{suffix} ],
2697             [
2698             [
2699             { 0 => [ $flag{yes_today_tom} ] },
2700             ],
2701             [ 1 ],
2702             ],
2703             [ { unit => 'day' }, { unit => 'hour' } ],
2704             [ '_unit_variant', '_ago_variant' ],
2705             {},
2706             ],
2707             [
2708             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(days?)$/i, 3 => 'ago' },
2709             [ [ 1, 2 ] ],
2710             [ $extended_checks{suffix} ],
2711             [
2712             [
2713             { 0 => [ $flag{yes_today_tom} ] },
2714             ],
2715             [ 1 ],
2716             ],
2717             [ { unit => 'day' }, { unit => 'day' } ],
2718             [ '_unit_variant', '_ago_variant' ],
2719             { truncate_to => [undef, q(day)] },
2720             ],
2721             [
2722             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(weeks?)$/i, 3 => 'ago' },
2723             [ [ 1, 2 ] ],
2724             [ $extended_checks{suffix} ],
2725             [
2726             [
2727             { 0 => [ $flag{yes_today_tom} ] },
2728             ],
2729             [ 1 ],
2730             ],
2731             [ { unit => 'day' }, { unit => 'week' } ],
2732             [ '_unit_variant', '_ago_variant' ],
2733             { truncate_to => [undef, q(day)] },
2734             ],
2735             [
2736             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago' },
2737             [ [ 1, 2 ] ],
2738             [ $extended_checks{suffix} ],
2739             [
2740             [
2741             { 0 => [ $flag{yes_today_tom} ] },
2742             ],
2743             [ 1 ],
2744             ],
2745             [ { unit => 'day' }, { unit => 'month' } ],
2746             [ '_unit_variant', '_ago_variant' ],
2747             { truncate_to => [undef, q(day)] },
2748             ],
2749             [
2750             { 0 => qr/^(today)$/i, 1 => $RE{number}, 2 => qr/^(years?)$/i, 3 => 'ago' },
2751             [ [ 1, 2 ] ],
2752             [ $extended_checks{suffix} ],
2753             [
2754             [
2755             { 0 => [ $flag{yes_today_tom} ] },
2756             ],
2757             [ 1 ],
2758             ],
2759             [ { unit => 'day' }, { unit => 'year' } ],
2760             [ '_unit_variant', '_ago_variant' ],
2761             { truncate_to => [undef, q(day)] },
2762             ],
2763             ],
2764             ago_yesterday => [
2765             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
2766             [
2767             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(milliseconds?)$/i, 3 => 'ago' },
2768             [ [ 1, 2 ] ],
2769             [ $extended_checks{suffix} ],
2770             [
2771             [
2772             { 0 => [ $flag{yes_today_tom} ] },
2773             ],
2774             [ 1 ],
2775             ],
2776             [ { unit => 'day' }, { unit => 'nanosecond', multiply_by => milli_to_nano } ],
2777             [ '_unit_variant', '_ago_variant' ],
2778             {},
2779             ],
2780             [
2781             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(seconds?)$/i, 3 => 'ago' },
2782             [ [ 1, 2 ] ],
2783             [ $extended_checks{suffix} ],
2784             [
2785             [
2786             { 0 => [ $flag{yes_today_tom} ] },
2787             ],
2788             [ 1 ],
2789             ],
2790             [ { unit => 'day' }, { unit => 'second' } ],
2791             [ '_unit_variant', '_ago_variant' ],
2792             {},
2793             ],
2794             [
2795             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(minutes?)$/i, 3 => 'ago' },
2796             [ [ 1, 2 ] ],
2797             [ $extended_checks{suffix} ],
2798             [
2799             [
2800             { 0 => [ $flag{yes_today_tom} ] },
2801             ],
2802             [ 1 ],
2803             ],
2804             [ { unit => 'day' }, { unit => 'minute' } ],
2805             [ '_unit_variant', '_ago_variant' ],
2806             {},
2807             ],
2808             [
2809             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(hours?)$/i, 3 => 'ago' },
2810             [ [ 1, 2 ] ],
2811             [ $extended_checks{suffix} ],
2812             [
2813             [
2814             { 0 => [ $flag{yes_today_tom} ] },
2815             ],
2816             [ 1 ],
2817             ],
2818             [ { unit => 'day' }, { unit => 'hour' } ],
2819             [ '_unit_variant', '_ago_variant' ],
2820             {},
2821             ],
2822             [
2823             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(days?)$/i, 3 => 'ago' },
2824             [ [ 1, 2 ] ],
2825             [ $extended_checks{suffix} ],
2826             [
2827             [
2828             { 0 => [ $flag{yes_today_tom} ] },
2829             ],
2830             [ 1 ],
2831             ],
2832             [ { unit => 'day' }, { unit => 'day' } ],
2833             [ '_unit_variant', '_ago_variant' ],
2834             { truncate_to => [undef, q(day)] },
2835             ],
2836             [
2837             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(weeks?)$/i, 3 => 'ago' },
2838             [ [ 1, 2 ] ],
2839             [ $extended_checks{suffix} ],
2840             [
2841             [
2842             { 0 => [ $flag{yes_today_tom} ] },
2843             ],
2844             [ 1 ],
2845             ],
2846             [ { unit => 'day' }, { unit => 'week' } ],
2847             [ '_unit_variant', '_ago_variant' ],
2848             { truncate_to => [undef, q(day)] },
2849             ],
2850             [
2851             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago' },
2852             [ [ 1, 2 ] ],
2853             [ $extended_checks{suffix} ],
2854             [
2855             [
2856             { 0 => [ $flag{yes_today_tom} ] },
2857             ],
2858             [ 1 ],
2859             ],
2860             [ { unit => 'day' }, { unit => 'month' } ],
2861             [ '_unit_variant', '_ago_variant' ],
2862             { truncate_to => [undef, q(day)] },
2863             ],
2864             [
2865             { 0 => qr/^(yesterday)$/i, 1 => $RE{number}, 2 => qr/^(years?)$/i, 3 => 'ago' },
2866             [ [ 1, 2 ] ],
2867             [ $extended_checks{suffix} ],
2868             [
2869             [
2870             { 0 => [ $flag{yes_today_tom} ] },
2871             ],
2872             [ 1 ],
2873             ],
2874             [ { unit => 'day' }, { unit => 'year' } ],
2875             [ '_unit_variant', '_ago_variant' ],
2876             { truncate_to => [undef, q(day)] },
2877             ],
2878             ],
2879             weekday_ago_at_time => [
2880             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR', 'REGEXP' ],
2881             [
2882             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago', 4 => $RE{time_min} },
2883             [ [ 1, 2 ] ],
2884             [ $extended_checks{suffix} ],
2885             [
2886             [ 1 ],
2887             [
2888             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2889             ],
2890             [ 4 ],
2891             ],
2892             [ { unit => 'month' }, {}, {} ],
2893             [ '_ago_variant', '_weekday', '_time' ],
2894             { truncate_to => [undef, undef, q(minute_second)] },
2895             ],
2896             [
2897             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago', 4 => $RE{time_am} },
2898             [ [ 1, 2 ], [ 4 ] ],
2899             [ $extended_checks{suffix}, $extended_checks{meridiem} ],
2900             [
2901             [ 1 ],
2902             [
2903             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2904             ],
2905             [
2906             { 4 => [ $flag{time_am} ] },
2907             ],
2908             ],
2909             [ { unit => 'month' }, {}, {} ],
2910             [ '_ago_variant', '_weekday', '_at' ],
2911             { truncate_to => [undef, undef, q(hour_minute_second)] },
2912             ],
2913             [
2914             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => qr/^(months?)$/i, 3 => 'ago', 4 => $RE{time_pm} },
2915             [ [ 1, 2 ], [ 4 ] ],
2916             [ $extended_checks{suffix}, $extended_checks{meridiem} ],
2917             [
2918             [ 1 ],
2919             [
2920             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
2921             ],
2922             [
2923             { 4 => [ $flag{time_pm} ] },
2924             ],
2925             ],
2926             [ { unit => 'month' }, {}, {} ],
2927             [ '_ago_variant', '_weekday', '_at' ],
2928             { truncate_to => [undef, undef, q(hour_minute_second)] },
2929             ],
2930             ],
2931             now_variant_before => [
2932             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
2933             [
2934             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
2935             [ [ 0, 1 ] ],
2936             [ $extended_checks{suffix} ],
2937             [
2938             [
2939             0,
2940             { 2 => [ $flag{before_after_from} ] },
2941             ],
2942             ],
2943             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
2944             [ '_now_variant' ],
2945             {},
2946             ],
2947             [
2948             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
2949             [ [ 0, 1 ] ],
2950             [ $extended_checks{suffix} ],
2951             [
2952             [
2953             0,
2954             { 2 => [ $flag{before_after_from} ] },
2955             ],
2956             ],
2957             [ { unit => 'second' } ],
2958             [ '_now_variant' ],
2959             {},
2960             ],
2961             [
2962             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
2963             [ [ 0, 1 ] ],
2964             [ $extended_checks{suffix} ],
2965             [
2966             [
2967             0,
2968             { 2 => [ $flag{before_after_from} ] },
2969             ],
2970             ],
2971             [ { unit => 'minute' } ],
2972             [ '_now_variant' ],
2973             {},
2974             ],
2975             [
2976             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
2977             [ [ 0, 1 ] ],
2978             [ $extended_checks{suffix} ],
2979             [
2980             [
2981             0,
2982             { 2 => [ $flag{before_after_from} ] },
2983             ],
2984             ],
2985             [ { unit => 'hour' } ],
2986             [ '_now_variant' ],
2987             {},
2988             ],
2989             [
2990             { 0 => $RE{number}, 1 => qr/^(days?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
2991             [ [ 0, 1 ] ],
2992             [ $extended_checks{suffix} ],
2993             [
2994             [
2995             0,
2996             { 2 => [ $flag{before_after_from} ] },
2997             ],
2998             ],
2999             [ { unit => 'day' } ],
3000             [ '_now_variant' ],
3001             {},
3002             ],
3003             [
3004             { 0 => $RE{number}, 1 => qr/^(weeks?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
3005             [ [ 0, 1 ] ],
3006             [ $extended_checks{suffix} ],
3007             [
3008             [
3009             0,
3010             { 2 => [ $flag{before_after_from} ] },
3011             ],
3012             ],
3013             [ { unit => 'week' } ],
3014             [ '_now_variant' ],
3015             {},
3016             ],
3017             [
3018             { 0 => $RE{number}, 1 => qr/^(months?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
3019             [ [ 0, 1 ] ],
3020             [ $extended_checks{suffix} ],
3021             [
3022             [
3023             0,
3024             { 2 => [ $flag{before_after_from} ] },
3025             ]
3026             ],
3027             [ { unit => 'month' } ],
3028             [ '_now_variant' ],
3029             {},
3030             ],
3031             [
3032             { 0 => $RE{number}, 1 => qr/^(years?)$/i, 2 => qr/^(before)$/i, 3 => 'now' },
3033             [ [ 0, 1 ] ],
3034             [ $extended_checks{suffix} ],
3035             [
3036             [
3037             0,
3038             { 2 => [ $flag{before_after_from} ] },
3039             ],
3040             ],
3041             [ { unit => 'year' } ],
3042             [ '_now_variant' ],
3043             {},
3044             ],
3045             ],
3046             now_variant_from => [
3047             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
3048             [
3049             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3050             [ [ 0, 1 ] ],
3051             [ $extended_checks{suffix} ],
3052             [
3053             [
3054             0,
3055             { 2 => [ $flag{before_after_from} ] },
3056             ],
3057             ],
3058             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3059             [ '_now_variant' ],
3060             {},
3061             ],
3062             [
3063             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3064             [ [ 0, 1 ] ],
3065             [ $extended_checks{suffix} ],
3066             [
3067             [
3068             0,
3069             { 2 => [ $flag{before_after_from} ] },
3070             ],
3071             ],
3072             [ { unit => 'second' } ],
3073             [ '_now_variant' ],
3074             {},
3075             ],
3076             [
3077             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3078             [ [ 0, 1 ] ],
3079             [ $extended_checks{suffix} ],
3080             [
3081             [
3082             0,
3083             { 2 => [ $flag{before_after_from} ] },
3084             ],
3085             ],
3086             [ { unit => 'minute' } ],
3087             [ '_now_variant' ],
3088             {},
3089             ],
3090             [
3091             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3092             [ [ 0, 1 ] ],
3093             [ $extended_checks{suffix} ],
3094             [
3095             [
3096             0,
3097             { 2 => [ $flag{before_after_from} ] },
3098             ],
3099             ],
3100             [ { unit => 'hour' } ],
3101             [ '_now_variant' ],
3102             {},
3103             ],
3104             [
3105             { 0 => $RE{number}, 1 => qr/^(days?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3106             [ [ 0, 1 ] ],
3107             [ $extended_checks{suffix} ],
3108             [
3109             [
3110             0,
3111             { 2 => [ $flag{before_after_from} ] },
3112             ],
3113             ],
3114             [ { unit => 'day' } ],
3115             [ '_now_variant' ],
3116             {},
3117             ],
3118             [
3119             { 0 => $RE{number}, 1 => qr/^(weeks?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3120             [ [ 0, 1 ] ],
3121             [ $extended_checks{suffix} ],
3122             [
3123             [
3124             0,
3125             { 2 => [ $flag{before_after_from} ] },
3126             ],
3127             ],
3128             [ { unit => 'week' } ],
3129             [ '_now_variant' ],
3130             {},
3131             ],
3132             [
3133             { 0 => $RE{number}, 1 => qr/^(months?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3134             [ [ 0, 1 ] ],
3135             [ $extended_checks{suffix} ],
3136             [
3137             [
3138             0,
3139             { 2 => [ $flag{before_after_from} ] },
3140             ],
3141             ],
3142             [ { unit => 'month' } ],
3143             [ '_now_variant' ],
3144             {},
3145             ],
3146             [
3147             { 0 => $RE{number}, 1 => qr/^(years?)$/i, 2 => qr/^(from)$/i, 3 => 'now' },
3148             [ [ 0, 1 ] ],
3149             [ $extended_checks{suffix} ],
3150             [
3151             [
3152             0,
3153             { 2 => [ $flag{before_after_from} ] },
3154             ],
3155             ],
3156             [ { unit => 'year' } ],
3157             [ '_now_variant' ],
3158             {},
3159             ],
3160             ],
3161             day_daytime => [
3162             [ 'REGEXP', 'REGEXP', 'SCALAR', 'SCALAR', 'SCALAR' ],
3163             [
3164             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => 'in', 3 => 'the', 4 => 'morning' },
3165             [],
3166             [],
3167             [
3168             [
3169             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3170             ],
3171             [ 1 ],
3172             ],
3173             [ {}, {} ],
3174             [ '_weekday', '_daytime' ],
3175             { truncate_to => [undef, q(hour)] },
3176             ],
3177             [
3178             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => 'in', 3 => 'the', 4 => 'afternoon' },
3179             [],
3180             [],
3181             [
3182             [
3183             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3184             ],
3185             [ 1 ],
3186             ],
3187             [ {}, { hours => 12 } ],
3188             [ '_weekday', '_daytime' ],
3189             { truncate_to => [undef, q(hour)] },
3190             ],
3191             [
3192             { 0 => $RE{weekday}, 1 => $RE{number}, 2 => 'in', 3 => 'the', 4 => 'evening' },
3193             [],
3194             [],
3195             [
3196             [
3197             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3198             ],
3199             [ 1 ],
3200             ],
3201             [ {}, { hours => 12 } ],
3202             [ '_weekday', '_daytime' ],
3203             { truncate_to => [undef, q(hour)] },
3204             ],
3205             ],
3206             variant_weekday_at_time => [
3207             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
3208             [
3209             { 0 => qr/^(next)$/i, 1 => $RE{weekday}, 2 => $RE{time} },
3210             [],
3211             [],
3212             [
3213             [
3214             { 0 => [ $flag{last_this_next} ] },
3215             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3216             ],
3217             [ 2 ],
3218             ],
3219             [ {}, {} ],
3220             [ '_count_day_variant_week', '_time' ],
3221             { truncate_to => [undef, q(hour_minute_second)] },
3222             ],
3223             [
3224             { 0 => qr/^(this)$/i, 1 => $RE{weekday}, 2 => $RE{time} },
3225             [],
3226             [],
3227             [
3228             [
3229             { 0 => [ $flag{last_this_next} ] },
3230             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3231             ],
3232             [ 2 ],
3233             ],
3234             [ {}, {} ],
3235             [ '_count_day_variant_week', '_time' ],
3236             { truncate_to => [undef, q(hour_minute_second)] },
3237             ],
3238             [
3239             { 0 => qr/^(last)$/i, 1 => $RE{weekday}, 2 => $RE{time} },
3240             [],
3241             [],
3242             [
3243             [
3244             { 0 => [ $flag{last_this_next} ] },
3245             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3246             ],
3247             [ 2 ],
3248             ],
3249             [ {}, {} ],
3250             [ '_count_day_variant_week', '_time' ],
3251             { truncate_to => [undef, q(hour_minute_second)] },
3252             ],
3253             ],
3254             count_day_variant_week => [
3255             [ 'REGEXP', 'SCALAR', 'REGEXP', 'SCALAR' ],
3256             [
3257             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(next)$/i, 3 => 'week' },
3258             [ [ 0 ] ],
3259             [ $extended_checks{ordinal} ],
3260             [
3261             [
3262             { 2 => [ $flag{last_this_next} ] },
3263             0,
3264             ],
3265             ],
3266             [ {} ],
3267             [ '_count_day_variant_week' ],
3268             { truncate_to => [q(day)] },
3269             ],
3270             [
3271             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(this)$/i, 3 => 'week' },
3272             [ [ 0 ] ],
3273             [ $extended_checks{ordinal} ],
3274             [
3275             [
3276             { 2 => [ $flag{last_this_next} ] },
3277             0,
3278             ],
3279             ],
3280             [ {} ],
3281             [ '_count_day_variant_week' ],
3282             { truncate_to => [q(day)] },
3283             ],
3284             [
3285             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(last)$/i, 3 => 'week' },
3286             [ [ 0 ] ],
3287             [ $extended_checks{ordinal} ],
3288             [
3289             [
3290             { 2 => [ $flag{last_this_next} ] },
3291             0,
3292             ],
3293             ],
3294             [ {} ],
3295             [ '_count_day_variant_week' ],
3296             { truncate_to => [q(day)] },
3297             ],
3298             ],
3299             count_day_variant_month => [
3300             [ 'REGEXP', 'SCALAR', 'REGEXP', 'SCALAR' ],
3301             [
3302             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(next)$/i, 3 => 'month' },
3303             [ [ 0 ] ],
3304             [ $extended_checks{ordinal} ],
3305             [
3306             [
3307             { 2 => [ $flag{last_this_next} ] },
3308             0,
3309             ],
3310             ],
3311             [ {} ],
3312             [ '_count_day_variant_month' ],
3313             { truncate_to => [q(day)] },
3314             ],
3315             [
3316             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(this)$/i, 3 => 'month' },
3317             [ [ 0 ] ],
3318             [ $extended_checks{ordinal} ],
3319             [
3320             [
3321             { 2 => [ $flag{last_this_next} ] },
3322             0,
3323             ],
3324             ],
3325             [ {} ],
3326             [ '_count_day_variant_month' ],
3327             { truncate_to => [q(day)] },
3328             ],
3329             [
3330             { 0 => $RE{day}, 1 => 'day', 2 => qr/^(last)$/i, 3 => 'month' },
3331             [ [ 0 ] ],
3332             [ $extended_checks{ordinal} ],
3333             [
3334             [
3335             { 2 => [ $flag{last_this_next} ] },
3336             0,
3337             ],
3338             ],
3339             [ {} ],
3340             [ '_count_day_variant_month' ],
3341             { truncate_to => [q(day)] },
3342             ],
3343             ],
3344             weekday_variant_week => [
3345             [ 'REGEXP', 'REGEXP', 'SCALAR' ],
3346             [
3347             { 0 => $RE{weekday}, 1 => qr/^(next)$/i, 2 => 'week' },
3348             [],
3349             [],
3350             [
3351             [
3352             { 1 => [ $flag{last_this_next} ] },
3353             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3354             ],
3355             ],
3356             [ {} ],
3357             [ '_count_day_variant_week' ],
3358             { truncate_to => [q(day)] },
3359             ],
3360             [
3361             { 0 => $RE{weekday}, 1 => qr/^(this)$/i, 2 => 'week' },
3362             [],
3363             [],
3364             [
3365             [
3366             { 1 => [ $flag{last_this_next} ] },
3367             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3368             ],
3369             ],
3370             [ {} ],
3371             [ '_count_day_variant_week' ],
3372             { truncate_to => [q(day)] },
3373             ],
3374             [
3375             { 0 => $RE{weekday}, 1 => qr/^(last)$/i, 2 => 'week' },
3376             [],
3377             [],
3378             [
3379             [
3380             { 1 => [ $flag{last_this_next} ] },
3381             { 0 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3382             ]
3383             ],
3384             [ {} ],
3385             [ '_count_day_variant_week' ],
3386             { truncate_to => [q(day)] },
3387             ],
3388             ],
3389             variant_week_weekday => [
3390             [ 'REGEXP', 'SCALAR', 'REGEXP' ],
3391             [
3392             { 0 => qr/^(next)$/i, 1 => 'week', 2 => $RE{weekday} },
3393             [],
3394             [],
3395             [
3396             [
3397             { 0 => [ $flag{last_this_next} ] },
3398             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3399             ],
3400             ],
3401             [ {} ],
3402             [ '_count_day_variant_week' ],
3403             { truncate_to => [q(day)] },
3404             ],
3405             [
3406             { 0 => qr/^(this)$/i, 1 => 'week', 2 => $RE{weekday} },
3407             [],
3408             [],
3409             [
3410             [
3411             { 0 => [ $flag{last_this_next} ] },
3412             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3413             ],
3414             ],
3415             [ {} ],
3416             [ '_count_day_variant_week' ],
3417             { truncate_to => [q(day)] },
3418             ],
3419             [
3420             { 0 => qr/^(last)$/i, 1 => 'week', 2 => $RE{weekday} },
3421             [],
3422             [],
3423             [
3424             [
3425             { 0 => [ $flag{last_this_next} ] },
3426             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3427             ],
3428             ],
3429             [ {} ],
3430             [ '_count_day_variant_week' ],
3431             { truncate_to => [q(day)] },
3432             ],
3433             ],
3434             count_month_variant_year => [
3435             [ 'REGEXP', 'SCALAR', 'REGEXP', 'SCALAR' ],
3436             [
3437             { 0 => $RE{day}, 1 => 'month', 2 => qr/^(next)$/i, 3 => 'year' },
3438             [ [ 0 ] ],
3439             [ $extended_checks{ordinal} ],
3440             [
3441             [
3442             { 2 => [ $flag{last_this_next} ] },
3443             0,
3444             ],
3445             ],
3446             [ {} ],
3447             [ '_count_month_variant_year' ],
3448             { truncate_to => [q(month)] },
3449             ],
3450             [
3451             { 0 => $RE{day}, 1 => 'month', 2 => qr/^(this)$/i, 3 => 'year' },
3452             [ [ 0 ] ],
3453             [ $extended_checks{ordinal} ],
3454             [
3455             [
3456             { 2 => [ $flag{last_this_next} ] },
3457             0,
3458             ],
3459             ],
3460             [ {} ],
3461             [ '_count_month_variant_year' ],
3462             { truncate_to => [q(month)] },
3463             ],
3464             [
3465             { 0 => $RE{day}, 1 => 'month', 2 => qr/^(last)$/i, 3 => 'year' },
3466             [ [ 0 ] ],
3467             [ $extended_checks{ordinal} ],
3468             [
3469             [
3470             { 2 => [ $flag{last_this_next} ] },
3471             0,
3472             ],
3473             ],
3474             [ {} ],
3475             [ '_count_month_variant_year' ],
3476             { truncate_to => [q(month)] },
3477             ],
3478             ],
3479             in_count_unit => [
3480             [ 'SCALAR', 'REGEXP', 'REGEXP' ],
3481             [
3482             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(milliseconds?)$/i },
3483             [ [ 1, 2 ] ],
3484             [ $extended_checks{suffix} ],
3485             [ [ 1 ] ],
3486             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3487             [ '_in_count_variant' ],
3488             {},
3489             ],
3490             [
3491             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(seconds?)$/i },
3492             [ [ 1, 2 ] ],
3493             [ $extended_checks{suffix} ],
3494             [ [ 1 ] ],
3495             [ { unit => 'second' } ],
3496             [ '_in_count_variant' ],
3497             {},
3498             ],
3499             [
3500             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(minutes?)$/i },
3501             [ [ 1, 2 ] ],
3502             [ $extended_checks{suffix} ],
3503             [ [ 1 ] ],
3504             [ { unit => 'minute' } ],
3505             [ '_in_count_variant' ],
3506             {},
3507             ],
3508             [
3509             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(hours?)$/i },
3510             [ [ 1, 2 ] ],
3511             [ $extended_checks{suffix} ],
3512             [ [ 1 ] ],
3513             [ { unit => 'hour' } ],
3514             [ '_in_count_variant' ],
3515             {},
3516             ],
3517             [
3518             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(days?)$/i },
3519             [ [ 1, 2 ] ],
3520             [ $extended_checks{suffix} ],
3521             [ [ 1 ] ],
3522             [ { unit => 'day' } ],
3523             [ '_in_count_variant' ],
3524             {},
3525             ],
3526             [
3527             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(weeks?)$/i },
3528             [ [ 1, 2 ] ],
3529             [ $extended_checks{suffix} ],
3530             [ [ 1 ] ],
3531             [ { unit => 'week' } ],
3532             [ '_in_count_variant' ],
3533             {},
3534             ],
3535             [
3536             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(months?)$/i },
3537             [ [ 1, 2 ] ],
3538             [ $extended_checks{suffix} ],
3539             [ [ 1 ] ],
3540             [ { unit => 'month' } ],
3541             [ '_in_count_variant' ],
3542             {},
3543             ],
3544             [
3545             { 0 => 'in', 1 => $RE{number}, 2 => qr/^(years?)$/i },
3546             [ [ 1, 2 ] ],
3547             [ $extended_checks{suffix} ],
3548             [ [ 1 ] ],
3549             [ { unit => 'year' } ],
3550             [ '_in_count_variant' ],
3551             {},
3552             ],
3553             ],
3554             count_weekday_variant_month => [
3555             [ 'REGEXP', 'REGEXP', 'REGEXP', 'REGEXP' ],
3556             [
3557             { 0 => $RE{day}, 1 => $RE{weekday}, 2 => qr/^(next)$/i, 3 => $RE{month} },
3558             [ [ 0 ] ],
3559             [ $extended_checks{ordinal} ],
3560             [
3561             [
3562             { 2 => [ $flag{last_this_next} ] },
3563             0,
3564             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3565             { 3 => [ $flag{month_name}, $flag{month_num} ] },
3566             ],
3567             ],
3568             [ {} ],
3569             [ '_count_weekday_variant_month' ],
3570             { truncate_to => [q(day)] },
3571             ],
3572             [
3573             { 0 => $RE{day}, 1 => $RE{weekday}, 2 => qr/^(this)$/i, 3 => $RE{month} },
3574             [ [ 0 ] ],
3575             [ $extended_checks{ordinal} ],
3576             [
3577             [
3578             { 2 => [ $flag{last_this_next} ] },
3579             0,
3580             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3581             { 3 => [ $flag{month_name}, $flag{month_num} ] },
3582             ],
3583             ],
3584             [ {} ],
3585             [ '_count_weekday_variant_month' ],
3586             { truncate_to => [q(day)] },
3587             ],
3588             [
3589             { 0 => $RE{day}, 1 => $RE{weekday}, 2 => qr/^(last)$/i, 3 => $RE{month} },
3590             [ [ 0 ] ],
3591             [ $extended_checks{ordinal} ],
3592             [
3593             [
3594             { 2 => [ $flag{last_this_next} ] },
3595             0,
3596             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
3597             { 3 => [ $flag{month_name}, $flag{month_num} ] },
3598             ],
3599             ],
3600             [ {} ],
3601             [ '_count_weekday_variant_month' ],
3602             { truncate_to => [q(day)] },
3603             ],
3604             ],
3605             daytime_hours_variant => [
3606             [ 'REGEXP', 'REGEXP', 'REGEXP', 'REGEXP' ],
3607             [
3608             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(yesterday)$/i },
3609             [ [ 0, 1 ] ],
3610             [ $extended_checks{suffix} ],
3611             [
3612             [
3613             0,
3614             { 2 => [ $flag{before_after_from} ] },
3615             { 3 => [ $flag{yes_today_tom} ] },
3616             ],
3617             ],
3618             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3619             [ '_daytime_unit_variant' ],
3620             {},
3621             ],
3622             [
3623             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(yesterday)$/i },
3624             [ [ 0, 1 ] ],
3625             [ $extended_checks{suffix} ],
3626             [
3627             [
3628             0,
3629             { 2 => [ $flag{before_after_from} ] },
3630             { 3 => [ $flag{yes_today_tom} ] },
3631             ],
3632             ],
3633             [ { unit => 'second' } ],
3634             [ '_daytime_unit_variant' ],
3635             { truncate_to => [q(second)] },
3636             ],
3637             [
3638             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(yesterday)$/i },
3639             [ [ 0, 1 ] ],
3640             [ $extended_checks{suffix} ],
3641             [
3642             [
3643             0,
3644             { 2 => [ $flag{before_after_from} ] },
3645             { 3 => [ $flag{yes_today_tom} ] },
3646             ],
3647             ],
3648             [ { unit => 'minute' } ],
3649             [ '_daytime_unit_variant' ],
3650             { truncate_to => [q(minute)] },
3651             ],
3652             [
3653             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(yesterday)$/i },
3654             [ [ 0, 1 ] ],
3655             [ $extended_checks{suffix} ],
3656             [
3657             [
3658             0,
3659             { 2 => [ $flag{before_after_from} ] },
3660             { 3 => [ $flag{yes_today_tom} ] },
3661             ],
3662             ],
3663             [ { unit => 'hour' } ],
3664             [ '_daytime_unit_variant' ],
3665             { truncate_to => [q(hour)] },
3666             ],
3667             [
3668             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(today)$/i },
3669             [ [ 0, 1 ] ],
3670             [ $extended_checks{suffix} ],
3671             [
3672             [
3673             0,
3674             { 2 => [ $flag{before_after_from} ] },
3675             { 3 => [ $flag{yes_today_tom} ] },
3676             ],
3677             ],
3678             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3679             [ '_daytime_unit_variant' ],
3680             {},
3681             ],
3682             [
3683             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(today)$/i },
3684             [ [ 0, 1 ] ],
3685             [ $extended_checks{suffix} ],
3686             [
3687             [
3688             0,
3689             { 2 => [ $flag{before_after_from} ] },
3690             { 3 => [ $flag{yes_today_tom} ] },
3691             ],
3692             ],
3693             [ { unit => 'second' } ],
3694             [ '_daytime_unit_variant' ],
3695             { truncate_to => [q(second)] },
3696             ],
3697             [
3698             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(today)$/i },
3699             [ [ 0, 1 ] ],
3700             [ $extended_checks{suffix} ],
3701             [
3702             [
3703             0,
3704             { 2 => [ $flag{before_after_from} ] },
3705             { 3 => [ $flag{yes_today_tom} ] },
3706             ],
3707             ],
3708             [ { unit => 'minute' } ],
3709             [ '_daytime_unit_variant' ],
3710             { truncate_to => [q(minute)] },
3711             ],
3712             [
3713             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(today)$/i },
3714             [ [ 0, 1 ] ],
3715             [ $extended_checks{suffix} ],
3716             [
3717             [
3718             0,
3719             { 2 => [ $flag{before_after_from} ] },
3720             { 3 => [ $flag{yes_today_tom} ] },
3721             ],
3722             ],
3723             [ { unit => 'hour' } ],
3724             [ '_daytime_unit_variant' ],
3725             { truncate_to => [q(hour)] },
3726             ],
3727             [
3728             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(tomorrow)$/i },
3729             [ [ 0, 1 ] ],
3730             [ $extended_checks{suffix} ],
3731             [
3732             [
3733             0,
3734             { 2 => [ $flag{before_after_from} ] },
3735             { 3 => [ $flag{yes_today_tom} ] },
3736             ],
3737             ],
3738             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3739             [ '_daytime_unit_variant' ],
3740             {},
3741             ],
3742             [
3743             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(tomorrow)$/i },
3744             [ [ 0, 1 ] ],
3745             [ $extended_checks{suffix} ],
3746             [
3747             [
3748             0,
3749             { 2 => [ $flag{before_after_from} ] },
3750             { 3 => [ $flag{yes_today_tom} ] },
3751             ],
3752             ],
3753             [ { unit => 'second' } ],
3754             [ '_daytime_unit_variant' ],
3755             { truncate_to => [q(second)] },
3756             ],
3757             [
3758             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(tomorrow)$/i },
3759             [ [ 0, 1 ] ],
3760             [ $extended_checks{suffix} ],
3761             [
3762             [
3763             0,
3764             { 2 => [ $flag{before_after_from} ] },
3765             { 3 => [ $flag{yes_today_tom} ] },
3766             ],
3767             ],
3768             [ { unit => 'minute' } ],
3769             [ '_daytime_unit_variant' ],
3770             { truncate_to => [q(minute)] },
3771             ],
3772             [
3773             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => qr/^(tomorrow)$/i },
3774             [ [ 0, 1 ] ],
3775             [ $extended_checks{suffix} ],
3776             [
3777             [
3778             0,
3779             { 2 => [ $flag{before_after_from} ] },
3780             { 3 => [ $flag{yes_today_tom} ] },
3781             ],
3782             ],
3783             [ { unit => 'hour' } ],
3784             [ '_daytime_unit_variant' ],
3785             { truncate_to => [q(hour)] },
3786             ],
3787             [
3788             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(yesterday)$/i },
3789             [ [ 0, 1 ] ],
3790             [ $extended_checks{suffix} ],
3791             [
3792             [
3793             0,
3794             { 2 => [ $flag{before_after_from} ] },
3795             { 3 => [ $flag{yes_today_tom} ] },
3796             ],
3797             ],
3798             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3799             [ '_daytime_unit_variant' ],
3800             {},
3801             ],
3802             [
3803             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(yesterday)$/i },
3804             [ [ 0, 1 ] ],
3805             [ $extended_checks{suffix} ],
3806             [
3807             [
3808             0,
3809             { 2 => [ $flag{before_after_from} ] },
3810             { 3 => [ $flag{yes_today_tom} ] },
3811             ],
3812             ],
3813             [ { unit => 'second' } ],
3814             [ '_daytime_unit_variant' ],
3815             { truncate_to => [q(second)] },
3816             ],
3817             [
3818             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(yesterday)$/i },
3819             [ [ 0, 1 ] ],
3820             [ $extended_checks{suffix} ],
3821             [
3822             [
3823             0,
3824             { 2 => [ $flag{before_after_from} ] },
3825             { 3 => [ $flag{yes_today_tom} ] },
3826             ],
3827             ],
3828             [ { unit => 'minute' } ],
3829             [ '_daytime_unit_variant' ],
3830             { truncate_to => [q(minute)] },
3831             ],
3832             [
3833             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(yesterday)$/i },
3834             [ [ 0, 1 ] ],
3835             [ $extended_checks{suffix} ],
3836             [
3837             [
3838             0,
3839             { 2 => [ $flag{before_after_from} ] },
3840             { 3 => [ $flag{yes_today_tom} ] },
3841             ],
3842             ],
3843             [ { unit => 'hour' } ],
3844             [ '_daytime_unit_variant' ],
3845             { truncate_to => [q(hour)] },
3846             ],
3847             [
3848             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(today)$/i },
3849             [ [ 0, 1 ] ],
3850             [ $extended_checks{suffix} ],
3851             [
3852             [
3853             0,
3854             { 2 => [ $flag{before_after_from} ] },
3855             { 3 => [ $flag{yes_today_tom} ] },
3856             ],
3857             ],
3858             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3859             [ '_daytime_unit_variant' ],
3860             {},
3861             ],
3862             [
3863             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(today)$/i },
3864             [ [ 0, 1 ] ],
3865             [ $extended_checks{suffix} ],
3866             [
3867             [
3868             0,
3869             { 2 => [ $flag{before_after_from} ] },
3870             { 3 => [ $flag{yes_today_tom} ] },
3871             ],
3872             ],
3873             [ { unit => 'second' } ],
3874             [ '_daytime_unit_variant' ],
3875             { truncate_to => [q(second)] },
3876             ],
3877             [
3878             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(today)$/i },
3879             [ [ 0, 1 ] ],
3880             [ $extended_checks{suffix} ],
3881             [
3882             [
3883             0,
3884             { 2 => [ $flag{before_after_from} ] },
3885             { 3 => [ $flag{yes_today_tom} ] },
3886             ],
3887             ],
3888             [ { unit => 'minute' } ],
3889             [ '_daytime_unit_variant' ],
3890             { truncate_to => [q(minute)] },
3891             ],
3892             [
3893             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(today)$/i },
3894             [ [ 0, 1 ] ],
3895             [ $extended_checks{suffix} ],
3896             [
3897             [
3898             0,
3899             { 2 => [ $flag{before_after_from} ] },
3900             { 3 => [ $flag{yes_today_tom} ] },
3901             ],
3902             ],
3903             [ { unit => 'hour' } ],
3904             [ '_daytime_unit_variant' ],
3905             { truncate_to => [q(hour)] },
3906             {},
3907             ],
3908             [
3909             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(tomorrow)$/i },
3910             [ [ 0, 1 ] ],
3911             [ $extended_checks{suffix} ],
3912             [
3913             [
3914             0,
3915             { 2 => [ $flag{before_after_from} ] },
3916             { 3 => [ $flag{yes_today_tom} ] },
3917             ],
3918             ],
3919             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
3920             [ '_daytime_unit_variant' ],
3921             {},
3922             ],
3923             [
3924             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(tomorrow)$/i },
3925             [ [ 0, 1 ] ],
3926             [ $extended_checks{suffix} ],
3927             [
3928             [
3929             0,
3930             { 2 => [ $flag{before_after_from} ] },
3931             { 3 => [ $flag{yes_today_tom} ] },
3932             ],
3933             ],
3934             [ { unit => 'second' } ],
3935             [ '_daytime_unit_variant' ],
3936             { truncate_to => [q(second)] },
3937             ],
3938             [
3939             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(tomorrow)$/i },
3940             [ [ 0, 1 ] ],
3941             [ $extended_checks{suffix} ],
3942             [
3943             [
3944             0,
3945             { 2 => [ $flag{before_after_from} ] },
3946             { 3 => [ $flag{yes_today_tom} ] },
3947             ],
3948             ],
3949             [ { unit => 'minute' } ],
3950             [ '_daytime_unit_variant' ],
3951             { truncate_to => [q(minute)] },
3952             ],
3953             [
3954             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(after)$/i, 3 => qr/^(tomorrow)$/i },
3955             [ [ 0, 1 ] ],
3956             [ $extended_checks{suffix} ],
3957             [
3958             [
3959             0,
3960             { 2 => [ $flag{before_after_from} ] },
3961             { 3 => [ $flag{yes_today_tom} ] },
3962             ],
3963             ],
3964             [ { unit => 'hour' } ],
3965             [ '_daytime_unit_variant' ],
3966             { truncate_to => [q(hour)] },
3967             ],
3968             ],
3969             hourtime_before_after_variant => [
3970             [ 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
3971             [
3972             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => 'noon' },
3973             [ [ 0, 1 ] ],
3974             [ $extended_checks{suffix} ],
3975             [
3976             [
3977             0,
3978             { 2 => [ $flag{before_after_from} ] },
3979             ],
3980             ],
3981             [ { hours => 12, unit => 'nanosecond', multiply_by => milli_to_nano } ],
3982             [ '_hourtime_variant' ],
3983             {},
3984             ],
3985             [
3986             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => 'noon' },
3987             [ [ 0, 1 ] ],
3988             [ $extended_checks{suffix} ],
3989             [
3990             [
3991             0,
3992             { 2 => [ $flag{before_after_from} ] },
3993             ],
3994             ],
3995             [ { hours => 12, unit => 'second' } ],
3996             [ '_hourtime_variant' ],
3997             { truncate_to => [q(second)] },
3998             ],
3999             [
4000             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => 'noon' },
4001             [ [ 0, 1 ] ],
4002             [ $extended_checks{suffix} ],
4003             [
4004             [
4005             0,
4006             { 2 => [ $flag{before_after_from} ] },
4007             ],
4008             ],
4009             [ { hours => 12, unit => 'minute' } ],
4010             [ '_hourtime_variant' ],
4011             { truncate_to => [q(minute)] },
4012             {},
4013             ],
4014             [
4015             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => 'noon' },
4016             [ [ 0, 1 ] ],
4017             [ $extended_checks{suffix} ],
4018             [
4019             [
4020             0,
4021             { 2 => [ $flag{before_after_from} ] },
4022             ],
4023             ],
4024             [ { hours => 12, unit => 'hour' } ],
4025             [ '_hourtime_variant' ],
4026             { truncate_to => [q(hour)] },
4027             {},
4028             ],
4029             [
4030             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(before)$/i, 3 => 'midnight' },
4031             [ [ 0, 1 ] ],
4032             [ $extended_checks{suffix} ],
4033             [
4034             [
4035             0,
4036             { 2 => [ $flag{before_after_from} ] },
4037             ],
4038             ],
4039             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
4040             [ '_hourtime_variant' ],
4041             {},
4042             ],
4043             [
4044             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(before)$/i, 3 => 'midnight' },
4045             [ [ 0, 1 ] ],
4046             [ $extended_checks{suffix} ],
4047             [
4048             [
4049             0,
4050             { 2 => [ $flag{before_after_from} ] },
4051             ],
4052             ],
4053             [ { unit => 'second' } ],
4054             [ '_hourtime_variant' ],
4055             { truncate_to => [q(second)] },
4056             {},
4057             ],
4058             [
4059             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(before)$/i, 3 => 'midnight' },
4060             [ [ 0, 1 ] ],
4061             [ $extended_checks{suffix} ],
4062             [
4063             [
4064             0,
4065             { 2 => [ $flag{before_after_from} ] },
4066             ],
4067             ],
4068             [ { unit => 'minute' } ],
4069             [ '_hourtime_variant' ],
4070             { truncate_to => [q(minute)] },
4071             ],
4072             [
4073             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(before)$/i, 3 => 'midnight' },
4074             [ [ 0, 1 ] ],
4075             [ $extended_checks{suffix} ],
4076             [
4077             [
4078             0,
4079             { 2 => [ $flag{before_after_from} ] },
4080             ],
4081             ],
4082             [ { unit => 'hour' } ],
4083             [ '_hourtime_variant' ],
4084             { truncate_to => [q(hour)] },
4085             ],
4086             [
4087             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(after)$/i, 3 => 'noon' },
4088             [ [ 0, 1 ] ],
4089             [ $extended_checks{suffix} ],
4090             [
4091             [
4092             0,
4093             { 2 => [ $flag{before_after_from} ] },
4094             ],
4095             ],
4096             [ { hours => 12, unit => 'nanosecond', multiply_by => milli_to_nano } ],
4097             [ '_hourtime_variant' ],
4098             {},
4099             ],
4100             [
4101             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(after)$/i, 3 => 'noon' },
4102             [ [ 0, 1 ] ],
4103             [ $extended_checks{suffix} ],
4104             [
4105             [
4106             0,
4107             { 2 => [ $flag{before_after_from} ] },
4108             ],
4109             ],
4110             [ { hours => 12, unit => 'second' } ],
4111             [ '_hourtime_variant' ],
4112             { truncate_to => [q(second)] },
4113             ],
4114             [
4115             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(after)$/i, 3 => 'noon' },
4116             [ [ 0, 1 ] ],
4117             [ $extended_checks{suffix} ],
4118             [
4119             [
4120             0,
4121             { 2 => [ $flag{before_after_from} ] },
4122             ],
4123             ],
4124             [ { hours => 12, unit => 'minute' } ],
4125             [ '_hourtime_variant' ],
4126             { truncate_to => [q(minute)] },
4127             ],
4128             [
4129             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(after)$/i, 3 => 'noon' },
4130             [ [ 0, 1 ] ],
4131             [ $extended_checks{suffix} ],
4132             [
4133             [
4134             0,
4135             { 2 => [ $flag{before_after_from} ] },
4136             ],
4137             ],
4138             [ { hours => 12, unit => 'hour' } ],
4139             [ '_hourtime_variant' ],
4140             { truncate_to => [q(hour)] },
4141             ],
4142             [
4143             { 0 => $RE{number}, 1 => qr/^(milliseconds?)$/i, 2 => qr/^(after)$/i, 3 => 'midnight' },
4144             [ [ 0, 1 ] ],
4145             [ $extended_checks{suffix} ],
4146             [
4147             [
4148             0,
4149             { 2 => [ $flag{before_after_from} ] },
4150             ],
4151             ],
4152             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
4153             [ '_hourtime_variant' ],
4154             {},
4155             ],
4156             [
4157             { 0 => $RE{number}, 1 => qr/^(seconds?)$/i, 2 => qr/^(after)$/i, 3 => 'midnight' },
4158             [ [ 0, 1 ] ],
4159             [ $extended_checks{suffix} ],
4160             [
4161             [
4162             0,
4163             { 2 => [ $flag{before_after_from} ] },
4164             ],
4165             ],
4166             [ { unit => 'second' } ],
4167             [ '_hourtime_variant' ],
4168             { truncate_to => [q(second)] },
4169             ],
4170             [
4171             { 0 => $RE{number}, 1 => qr/^(minutes?)$/i, 2 => qr/^(after)$/i, 3 => 'midnight' },
4172             [ [ 0, 1 ] ],
4173             [ $extended_checks{suffix} ],
4174             [
4175             [
4176             0,
4177             { 2 => [ $flag{before_after_from} ] },
4178             ],
4179             ],
4180             [ { unit => 'minute' } ],
4181             [ '_hourtime_variant' ],
4182             { truncate_to => [q(minute)] },
4183             ],
4184             [
4185             { 0 => $RE{number}, 1 => qr/^(hours?)$/i, 2 => qr/^(after)$/i, 3 => 'midnight' },
4186             [ [ 0, 1 ] ],
4187             [ $extended_checks{suffix} ],
4188             [
4189             [
4190             0,
4191             { 2 => [ $flag{before_after_from} ] },
4192             ],
4193             ],
4194             [ { unit => 'hour' } ],
4195             [ '_hourtime_variant' ],
4196             { truncate_to => [q(hour)] },
4197             ],
4198             ],
4199             day_at => [
4200             [ 'REGEXP', 'REGEXP' ],
4201             [
4202             { 0 => qr/^(yesterday)$/i, 1 => $RE{time} },
4203             [],
4204             [],
4205             [
4206             [
4207             { 0 => [ $flag{yes_today_tom} ] },
4208             ],
4209             [ 1 ],
4210             ],
4211             [ { unit => 'day' }, {} ],
4212             [ '_unit_variant', '_time' ],
4213             { truncate_to => [undef, q(hour_minute_second)] },
4214             ],
4215             [
4216             { 0 => qr/^(today)$/i, 1 => $RE{time} },
4217             [],
4218             [],
4219             [
4220             [
4221             { 0 => [ $flag{yes_today_tom} ] },
4222             ],
4223             [ 1 ],
4224             ],
4225             [ { unit => 'day' }, {} ],
4226             [ '_unit_variant', '_time' ],
4227             { truncate_to => [undef, q(hour_minute_second)] },
4228             ],
4229             [
4230             { 0 => qr/^(tomorrow)$/i, 1 => $RE{time} },
4231             [],
4232             [],
4233             [
4234             [
4235             { 0 => [ $flag{yes_today_tom} ] },
4236             ],
4237             [ 1 ],
4238             ],
4239             [ { unit => 'day' }, {} ],
4240             [ '_unit_variant', '_time' ],
4241             { truncate_to => [undef, q(hour_minute_second)] },
4242             ],
4243             [
4244             { 0 => qr/^(yesterday)$/i, 1 => $RE{time_am} },
4245             [ [ 1 ] ],
4246             [ $extended_checks{meridiem} ],
4247             [
4248             [
4249             { 0 => [ $flag{yes_today_tom} ] },
4250             ],
4251             [
4252             { 1 => [ $flag{time_am} ] },
4253             ],
4254             ],
4255             [ { unit => 'day' }, {} ],
4256             [ '_unit_variant', '_at' ],
4257             { truncate_to => [undef, q(hour_minute_second)] },
4258             ],
4259             [
4260             { 0 => qr/^(today)$/i, 1 => $RE{time_am} },
4261             [ [ 1 ] ],
4262             [ $extended_checks{meridiem} ],
4263             [
4264             [
4265             { 0 => [ $flag{yes_today_tom} ] },
4266             ],
4267             [
4268             { 1 => [ $flag{time_am} ] },
4269             ],
4270             ],
4271             [ { unit => 'day' }, {} ],
4272             [ '_unit_variant', '_at' ],
4273             { truncate_to => [undef, q(hour_minute_second)] },
4274             ],
4275             [
4276             { 0 => qr/^(tomorrow)$/i, 1 => $RE{time_am} },
4277             [ [ 1 ] ],
4278             [ $extended_checks{meridiem} ],
4279             [
4280             [
4281             { 0 => [ $flag{yes_today_tom} ] },
4282             ],
4283             [
4284             { 1 => [ $flag{time_am} ] },
4285             ],
4286             ],
4287             [ { unit => 'day' }, {} ],
4288             [ '_unit_variant', '_at' ],
4289             { truncate_to => [undef, q(hour_minute_second)] },
4290             ],
4291             [
4292             { 0 => qr/^(yesterday)$/i, 1 => $RE{time_pm} },
4293             [ [ 1 ] ],
4294             [ $extended_checks{meridiem} ],
4295             [
4296             [
4297             { 0 => [ $flag{yes_today_tom} ] },
4298             ],
4299             [
4300             { 1 => [ $flag{time_pm} ] },
4301             ],
4302             ],
4303             [ { unit => 'day' }, {} ],
4304             [ '_unit_variant', '_at' ],
4305             { truncate_to => [undef, q(hour_minute_second)] },
4306             ],
4307             [
4308             { 0 => qr/^(today)$/i, 1 => $RE{time_pm} },
4309             [ [ 1 ] ],
4310             [ $extended_checks{meridiem} ],
4311             [
4312             [
4313             { 0 => [ $flag{yes_today_tom} ] },
4314             ],
4315             [
4316             { 1 => [ $flag{time_pm} ] },
4317             ],
4318             ],
4319             [ { unit => 'day' }, {} ],
4320             [ '_unit_variant', '_at' ],
4321             { truncate_to => [undef, q(hour_minute_second)] },
4322             ],
4323             [
4324             { 0 => qr/^(tomorrow)$/i, 1 => $RE{time_pm} },
4325             [ [ 1 ] ],
4326             [ $extended_checks{meridiem} ],
4327             [
4328             [
4329             { 0 => [ $flag{yes_today_tom} ] },
4330             ],
4331             [
4332             { 1 => [ $flag{time_pm} ] },
4333             ],
4334             ],
4335             [ { unit => 'day' }, {} ],
4336             [ '_unit_variant', '_at' ],
4337             { truncate_to => [undef, q(hour_minute_second)] },
4338             ],
4339             ],
4340             time_on_weekday => [
4341             [ 'REGEXP', 'SCALAR', 'REGEXP' ],
4342             [
4343             { 0 => $RE{time}, 1 => 'on', 2 => $RE{weekday} },
4344             [],
4345             [],
4346             [
4347             [ 0 ],
4348             [
4349             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4350             ],
4351             ],
4352             [ {}, {} ],
4353             [ '_time', '_weekday' ],
4354             {
4355             advance_future => true,
4356             truncate_to => [undef, q(hour_minute_second)],
4357             },
4358             ],
4359             [
4360             { 0 => $RE{time_am}, 1 => 'on', 2 => $RE{weekday} },
4361             [ [ 0 ] ],
4362             [ $extended_checks{meridiem} ],
4363             [
4364             [
4365             { 0 => [ $flag{time_am} ] },
4366             ],
4367             [
4368             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4369             ],
4370             ],
4371             [ {}, {} ],
4372             [ '_at', '_weekday' ],
4373             {
4374             advance_future => true,
4375             truncate_to => [undef, q(hour_minute_second)],
4376             },
4377             ],
4378             [
4379             { 0 => $RE{time_pm}, 1 => 'on', 2 => $RE{weekday} },
4380             [ [ 0 ] ],
4381             [ $extended_checks{meridiem} ],
4382             [
4383             [
4384             { 0 => [ $flag{time_pm} ] },
4385             ],
4386             [
4387             { 2 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4388             ],
4389             ],
4390             [ {}, {} ],
4391             [ '_at', '_weekday' ],
4392             {
4393             advance_future => true,
4394             truncate_to => [undef, q(hour_minute_second)],
4395             },
4396             ],
4397             ],
4398             day_month_year => [
4399             [ 'REGEXP', 'REGEXP', 'REGEXP' ],
4400             [
4401             { 0 => $RE{monthday}, 1 => $RE{month}, 2 => $RE{year} },
4402             [ [ 0 ] ],
4403             [ $extended_checks{ordinal} ],
4404             [
4405             [
4406             0,
4407             { 1 => [ $flag{month_name}, $flag{month_num} ] },
4408             2,
4409             ],
4410             ],
4411             [ {} ],
4412             [ '_day_month_year' ],
4413             { truncate_to => [q(day)] },
4414             ],
4415             [
4416             { 0 => $RE{month}, 1 => $RE{monthday}, 2 => $RE{year} },
4417             [ [ 1 ] ],
4418             [ $extended_checks{ordinal} ],
4419             [
4420             [
4421             1,
4422             { 0 => [ $flag{month_name}, $flag{month_num} ] },
4423             2,
4424             ],
4425             ],
4426             [ {} ],
4427             [ '_day_month_year' ],
4428             { truncate_to => [q(day)] },
4429             ],
4430             ],
4431             count_weekday_in_month => [
4432             [ 'REGEXP', 'REGEXP', 'SCALAR', 'REGEXP' ],
4433             [
4434             { 0 => $RE{day}, 1 => $RE{weekday}, 2 => 'in', 3 => $RE{month} },
4435             [ [ 0 ] ],
4436             [ $extended_checks{ordinal} ],
4437             [
4438             [
4439             { VALUE => 0 },
4440             0,
4441             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4442             { 3 => [ $flag{month_name}, $flag{month_num} ] },
4443             ],
4444             ],
4445             [ {} ],
4446             [ '_count_weekday_variant_month' ],
4447             { truncate_to => [q(day)] },
4448             ],
4449             ],
4450             count_weekday_from_now => [
4451             [ 'REGEXP', 'REGEXP', 'SCALAR', 'SCALAR' ],
4452             [
4453             { 0 => $RE{number}, 1 => $RE{weekdays}, 2 => 'from', 3 => 'now' },
4454             [ [ 0, 1 ] ],
4455             [ $extended_checks{suffix} ],
4456             [
4457             [
4458             0,
4459             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4460             ],
4461             ],
4462             [ {} ],
4463             [ '_count_weekday_from_now' ],
4464             { truncate_to => [q(day)] },
4465             ],
4466             ],
4467             final_weekday_in_month => [
4468             [ 'SCALAR', 'REGEXP', 'SCALAR', 'REGEXP' ],
4469             [
4470             { 0 => 'final', 1 => $RE{weekday}, 2 => 'in', 3 => $RE{month} },
4471             [],
4472             [],
4473             [
4474             [
4475             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4476             { 3 => [ $flag{month_name}, $flag{month_num} ] },
4477             ],
4478             ],
4479             [ {} ],
4480             [ '_final_weekday_in_month' ],
4481             { truncate_to => [q(day)] },
4482             ],
4483             [
4484             { 0 => 'last', 1 => $RE{weekday}, 2 => 'in', 3 => $RE{month} },
4485             [],
4486             [],
4487             [
4488             [
4489             { 1 => [ $flag{weekday_name}, $flag{weekday_num} ] },
4490             { 3 => [ $flag{month_name}, $flag{month_num} ] },
4491             ],
4492             ],
4493             [ {} ],
4494             [ '_final_weekday_in_month' ],
4495             { truncate_to => [q(day)] },
4496             ],
4497             ],
4498             for_count_unit => [
4499             [ 'SCALAR', 'REGEXP', 'REGEXP' ],
4500             [
4501             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(milliseconds?)$/i },
4502             [ [ 1, 2 ] ],
4503             [ $extended_checks{suffix} ],
4504             [
4505             [ 1 ],
4506             ],
4507             [ { unit => 'nanosecond', multiply_by => milli_to_nano } ],
4508             [ '_in_count_variant' ],
4509             {},
4510             ],
4511             [
4512             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(seconds?)$/i },
4513             [ [ 1, 2 ] ],
4514             [ $extended_checks{suffix} ],
4515             [
4516             [ 1 ],
4517             ],
4518             [ { unit => 'second' } ],
4519             [ '_in_count_variant' ],
4520             {},
4521             ],
4522             [
4523             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(minutes?)$/i },
4524             [ [ 1, 2 ] ],
4525             [ $extended_checks{suffix} ],
4526             [
4527             [ 1 ],
4528             ],
4529             [ { unit => 'minute' } ],
4530             [ '_in_count_variant' ],
4531             {},
4532             ],
4533             [
4534             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(hours?)$/i },
4535             [ [ 1, 2 ] ],
4536             [ $extended_checks{suffix} ],
4537             [
4538             [ 1 ],
4539             ],
4540             [ { unit => 'hour' } ],
4541             [ '_in_count_variant' ],
4542             {},
4543             ],
4544             [
4545             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(days?)$/i },
4546             [ [ 1, 2 ] ],
4547             [ $extended_checks{suffix} ],
4548             [
4549             [ 1 ],
4550             ],
4551             [ { unit => 'day' } ],
4552             [ '_in_count_variant' ],
4553             {},
4554             ],
4555             [
4556             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(weeks?)$/i },
4557             [ [ 1, 2 ] ],
4558             [ $extended_checks{suffix} ],
4559             [
4560             [ 1 ],
4561             ],
4562             [ { unit => 'week' } ],
4563             [ '_in_count_variant' ],
4564             {},
4565             ],
4566             [
4567             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(months?)$/i },
4568             [ [ 1, 2 ] ],
4569             [ $extended_checks{suffix} ],
4570             [
4571             [ 1 ],
4572             ],
4573             [ { unit => 'month' } ],
4574             [ '_in_count_variant' ],
4575             {},
4576             ],
4577             [
4578             { 0 => 'for', 1 => $RE{number}, 2 => qr/^(years?)$/i },
4579             [ [ 1, 2 ] ],
4580             [ $extended_checks{suffix} ],
4581             [
4582             [ 1 ],
4583             ],
4584             [ { unit => 'year' } ],
4585             [ '_in_count_variant' ],
4586             {},
4587             ],
4588             ],
4589             first_last_day_unit => [
4590             [ 'SCALAR', 'SCALAR', 'SCALAR', 'REGEXP' ],
4591             [
4592             { 0 => 'first', 1 => 'day', 2 => 'of', 3 => $RE{month} },
4593             [],
4594             [],
4595             [
4596             [
4597             { 3 => [ $flag{month_name}, $flag{month_num} ] },
4598             { VALUE => 1 },
4599             ],
4600             ],
4601             [ {} ],
4602             [ '_first_last_day_unit' ],
4603             { truncate_to => [q(day)] },
4604             ],
4605             [
4606             { 0 => 'first', 1 => 'day', 2 => 'of', 3 => $RE{year} },
4607             [],
4608             [],
4609             [
4610             [
4611             3,
4612             { VALUE => 1 },
4613             { VALUE => 1 },
4614             ],
4615             ],
4616             [ {} ],
4617             [ '_first_last_day_unit' ],
4618             { truncate_to => [q(day)] },
4619             ],
4620             [
4621             { 0 => 'last', 1 => 'day', 2 => 'of', 3 => $RE{month} },
4622             [],
4623             [],
4624             [
4625             [
4626             { 3 => [ $flag{month_name}, $flag{month_num} ] },
4627             { VALUE => undef },
4628             ],
4629             ],
4630             [ {} ],
4631             [ '_first_last_day_unit' ],
4632             { truncate_to => [q(day)] },
4633             ],
4634             [
4635             { 0 => 'last', 1 => 'day', 2 => 'of', 3 => $RE{year} },
4636             [],
4637             [],
4638             [
4639             [
4640             3,
4641             { VALUE => 12 },
4642             { VALUE => undef },
4643             ],
4644             ],
4645             [ {} ],
4646             [ '_first_last_day_unit' ],
4647             { truncate_to => [q(day)] },
4648             ],
4649             ],
4650             variant_last_month => [
4651             [ 'SCALAR', 'SCALAR', 'SCALAR', 'SCALAR' ],
4652             [
4653             { 0 => 'beginning', 1 => 'of', 2 => 'last', 3 => 'month' },
4654             [],
4655             [],
4656             [
4657             [
4658             { VALUE => 1 },
4659             ],
4660             ],
4661             [ {} ],
4662             [ '_variant_last_month' ],
4663             { truncate_to => [q(day)] },
4664             ],
4665             [
4666             { 0 => 'end', 1 => 'of', 2 => 'last', 3 => 'month' },
4667             [],
4668             [],
4669             [
4670             [
4671             { VALUE => undef },
4672             ],
4673             ],
4674             [ {} ],
4675             [ '_variant_last_month' ],
4676             { truncate_to => [q(day)] },
4677             ],
4678             ],
4679             variant_quarter => [
4680             [ 'REGEXP', 'SCALAR' ],
4681             [
4682             { 0 => qr/^(last)$/i, 1 => 'quarter' },
4683             [],
4684             [],
4685             [
4686             [
4687             { 0 => [ $flag{last_this_next} ] },
4688             ],
4689             ],
4690             [ { unit => 'month' } ],
4691             [ '_variant_quarter' ],
4692             { truncate_to => [q(day)] },
4693             ],
4694             [
4695             { 0 => qr/^(this)$/i, 1 => 'quarter' },
4696             [],
4697             [],
4698             [
4699             [
4700             { 0 => [ $flag{last_this_next} ] },
4701             ],
4702             ],
4703             [ { unit => 'month' } ],
4704             [ '_variant_quarter' ],
4705             { truncate_to => [q(day)] },
4706             ],
4707             [
4708             { 0 => qr/^(next)$/i, 1 => 'quarter' },
4709             [],
4710             [],
4711             [
4712             [
4713             { 0 => [ $flag{last_this_next} ] },
4714             ],
4715             ],
4716             [ { unit => 'month' } ],
4717             [ '_variant_quarter' ],
4718             { truncate_to => [q(day)] },
4719             ],
4720             ],
4721             );
4722              
4723             1;
4724             __END__
4725              
4726             =head1 NAME
4727              
4728             DateTime::Format::Natural::Lang::EN - English language metadata
4729              
4730             =head1 DESCRIPTION
4731              
4732             C<DateTime::Format::Natural::Lang::EN> provides the english specific grammar
4733             and variables. This class is loaded if the user either specifies the english
4734             language or implicitly.
4735              
4736             =head1 EXAMPLES
4737              
4738             Below are some examples of natural language date/time input in english (be aware
4739             that the parser does usually not distinguish between lower/upper case; furthermore,
4740             many expressions allow for additional leading/trailing time and all times are
4741             also parsable with precision in (milli)seconds):
4742              
4743             =head2 Simple
4744              
4745             now
4746             yesterday
4747             today
4748             tomorrow
4749             morning
4750             afternoon
4751             evening
4752             noon
4753             midnight
4754             yesterday at noon
4755             yesterday at midnight
4756             today at noon
4757             today at midnight
4758             tomorrow at noon
4759             tomorrow at midnight
4760             this morning
4761             this afternoon
4762             this evening
4763             yesterday morning
4764             yesterday afternoon
4765             yesterday evening
4766             today morning
4767             today afternoon
4768             today evening
4769             tomorrow morning
4770             tomorrow afternoon
4771             tomorrow evening
4772             thursday morning
4773             thursday afternoon
4774             thursday evening
4775             6:00 yesterday
4776             6:00 today
4777             6:00 tomorrow
4778             5am yesterday
4779             5am today
4780             5am tomorrow
4781             4pm yesterday
4782             4pm today
4783             4pm tomorrow
4784             last millisecond
4785             this millisecond
4786             next millisecond
4787             last second
4788             this second
4789             next second
4790             last minute
4791             this minute
4792             next minute
4793             last hour
4794             this hour
4795             next hour
4796             last day
4797             this day
4798             next day
4799             last week
4800             this week
4801             next week
4802             last month
4803             this month
4804             next month
4805             last quarter
4806             this quarter
4807             next quarter
4808             last year
4809             this year
4810             next year
4811             last friday
4812             this friday
4813             next friday
4814             tuesday last week
4815             tuesday this week
4816             tuesday next week
4817             last week wednesday
4818             this week wednesday
4819             next week wednesday
4820             10 milliseconds ago
4821             10 seconds ago
4822             10 minutes ago
4823             10 hours ago
4824             10 days ago
4825             10 weeks ago
4826             10 months ago
4827             10 years ago
4828             in 5 milliseconds
4829             in 5 seconds
4830             in 5 minutes
4831             in 5 hours
4832             in 5 days
4833             in 5 weeks
4834             in 5 months
4835             in 5 years
4836             saturday
4837             sunday 11:00
4838             yesterday at 4:00
4839             today at 4:00
4840             tomorrow at 4:00
4841             yesterday at 6:45am
4842             today at 6:45am
4843             tomorrow at 6:45am
4844             yesterday at 6:45pm
4845             today at 6:45pm
4846             tomorrow at 6:45pm
4847             yesterday at 2:32 AM
4848             today at 2:32 AM
4849             tomorrow at 2:32 AM
4850             yesterday at 2:32 PM
4851             today at 2:32 PM
4852             tomorrow at 2:32 PM
4853             yesterday 02:32
4854             today 02:32
4855             tomorrow 02:32
4856             yesterday 2:32am
4857             today 2:32am
4858             tomorrow 2:32am
4859             yesterday 2:32pm
4860             today 2:32pm
4861             tomorrow 2:32pm
4862             wednesday at 14:30
4863             wednesday at 02:30am
4864             wednesday at 02:30pm
4865             wednesday 14:30
4866             wednesday 02:30am
4867             wednesday 02:30pm
4868             friday 03:00 am
4869             friday 03:00 pm
4870             sunday at 05:00 am
4871             sunday at 05:00 pm
4872             2nd monday
4873             100th day
4874             4th february
4875             november 3rd
4876             last june
4877             next october
4878             6 am
4879             5am
4880             5:30am
4881             8 pm
4882             4pm
4883             4:20pm
4884             06:56:06 am
4885             06:56:06 pm
4886             mon 2:35
4887             1:00 sun
4888             1am sun
4889             1pm sun
4890             1:00 on sun
4891             1am on sun
4892             1pm on sun
4893             12:14 PM
4894             12:14 AM
4895              
4896             =head2 Complex
4897              
4898             yesterday 7 milliseconds ago
4899             yesterday 7 seconds ago
4900             yesterday 7 minutes ago
4901             yesterday 7 hours ago
4902             yesterday 7 days ago
4903             yesterday 7 weeks ago
4904             yesterday 7 months ago
4905             yesterday 7 years ago
4906             today 5 milliseconds ago
4907             today 5 seconds ago
4908             today 5 minutes ago
4909             today 5 hours ago
4910             today 5 days ago
4911             today 5 weeks ago
4912             today 5 months ago
4913             today 5 years ago
4914             tomorrow 3 milliseconds ago
4915             tomorrow 3 seconds ago
4916             tomorrow 3 minutes ago
4917             tomorrow 3 hours ago
4918             tomorrow 3 days ago
4919             tomorrow 3 weeks ago
4920             tomorrow 3 months ago
4921             tomorrow 3 years ago
4922             2 milliseconds before now
4923             2 seconds before now
4924             2 minutes before now
4925             2 hours before now
4926             2 days before now
4927             2 weeks before now
4928             2 months before now
4929             2 years before now
4930             4 milliseconds from now
4931             4 seconds from now
4932             4 minutes from now
4933             4 hours from now
4934             4 days from now
4935             4 weeks from now
4936             4 months from now
4937             4 years from now
4938             6 in the morning
4939             4 in the afternoon
4940             9 in the evening
4941             monday 6 in the morning
4942             monday 4 in the afternoon
4943             monday 9 in the evening
4944             last sunday at 21:45
4945             monday last week
4946             6th day last week
4947             6th day this week
4948             6th day next week
4949             12th day last month
4950             12th day this month
4951             12th day next month
4952             1st day last year
4953             1st day this year
4954             1st day next year
4955             1st tuesday last november
4956             1st tuesday this november
4957             1st tuesday next november
4958             11 january next year
4959             11 january this year
4960             11 january last year
4961             6 milliseconds before yesterday
4962             6 seconds before yesterday
4963             6 minutes before yesterday
4964             6 hours before yesterday
4965             6 milliseconds before today
4966             6 seconds before today
4967             6 minutes before today
4968             6 hours before today
4969             6 milliseconds before tomorrow
4970             6 seconds before tomorrow
4971             6 minutes before tomorrow
4972             6 hours before tomorrow
4973             3 milliseconds after yesterday
4974             3 seconds after yesterday
4975             3 minutes after yesterday
4976             3 hours after yesterday
4977             3 milliseconds after today
4978             3 seconds after today
4979             3 minutes after today
4980             3 hours after today
4981             3 milliseconds after tomorrow
4982             3 seconds after tomorrow
4983             3 minutes after tomorrow
4984             3 hours after tomorrow
4985             10 milliseconds before noon
4986             10 seconds before noon
4987             10 minutes before noon
4988             10 hours before noon
4989             10 milliseconds before midnight
4990             10 seconds before midnight
4991             10 minutes before midnight
4992             10 hours before midnight
4993             5 milliseconds after noon
4994             5 seconds after noon
4995             5 minutes after noon
4996             5 hours after noon
4997             5 milliseconds after midnight
4998             5 seconds after midnight
4999             5 minutes after midnight
5000             5 hours after midnight
5001             noon last friday
5002             midnight last friday
5003             noon this friday
5004             midnight this friday
5005             noon next friday
5006             midnight next friday
5007             last friday at 20:00
5008             this friday at 20:00
5009             next friday at 20:00
5010             1:00 last friday
5011             1:00 this friday
5012             1:00 next friday
5013             1am last friday
5014             1am this friday
5015             1am next friday
5016             1pm last friday
5017             1pm this friday
5018             1pm next friday
5019             5 am last monday
5020             5 am this monday
5021             5 am next monday
5022             5 pm last monday
5023             5 pm this monday
5024             5 pm next monday
5025             last wednesday 7am
5026             this wednesday 7am
5027             next wednesday 7am
5028             last wednesday 7pm
5029             this wednesday 7pm
5030             next wednesday 7pm
5031             last tuesday 11 am
5032             this tuesday 11 am
5033             next tuesday 11 am
5034             last tuesday 11 pm
5035             this tuesday 11 pm
5036             next tuesday 11 pm
5037             yesterday at 13:00
5038             today at 13:00
5039             tomorrow at 13
5040             2nd friday in august
5041             3rd wednesday in november
5042             tomorrow 1 year ago
5043             saturday 3 months ago at 17:00
5044             saturday 3 months ago at 5:00am
5045             saturday 3 months ago at 5:00pm
5046             11 january 2 years ago
5047             4th day last week
5048             8th month last year
5049             8th month this year
5050             8th month next year
5051             6 mondays from now
5052             fri 3 months ago at 5am
5053             wednesday 1 month ago at 8pm
5054             final thursday in april
5055             last thursday in april
5056             beginning of last month
5057             end of last month
5058              
5059             =head2 Timespans
5060              
5061             monday to friday
5062             1 April to 31 August
5063             1999-12-31 to tomorrow
5064             now to 2010-01-01
5065             2009-03-10 9:00 to 11:00
5066             26 oct 10:00 am to 11:00 am
5067             jan 1 to 2
5068             16:00 nov 6 to 17:00
5069             may 2nd to 5th
5070             100th day to 200th
5071             6am dec 5 to 7am
5072             30th to 31st dec
5073             30th to dec 31st
5074             21:00 to mar 3 22:00
5075             21:00 to 22:00 mar 3
5076             10th to 20th day
5077             1/3 to 2/3
5078             2/3 to in 1 week
5079             3/3 21:00 to in 5 days
5080             first day of 2009 to last day of 2009
5081             first day of may to last day of may
5082             first to last day of 2008
5083             first to last day of september
5084             for 4 milliseconds
5085             for 4 seconds
5086             for 4 minutes
5087             for 4 hours
5088             for 4 days
5089             for 4 weeks
5090             for 4 months
5091             for 4 years
5092              
5093             =head2 Specific
5094              
5095             march
5096             january 11
5097             11 january
5098             18 oct 17:00
5099             18 oct 5am
5100             18 oct 5pm
5101             18 oct 5 am
5102             18 oct 5 pm
5103             dec 25
5104             feb 28 3:00
5105             feb 28 3am
5106             feb 28 3pm
5107             feb 28 3 am
5108             feb 28 3 pm
5109             19:00 jul 1
5110             7am jul 1
5111             7pm jul 1
5112             7 am jul 1
5113             7 pm jul 1
5114             jan 24, 2011 12:00
5115             jan 24, 2011 12am
5116             jan 24, 2011 12pm
5117             may 27th
5118             2005
5119             march 1st 2009
5120             October 2006
5121             february 14, 2004
5122             jan 3 2010
5123             3 jan 2000
5124             2010 october 28
5125             2011-jan-04
5126             27/5/1979
5127             1/3
5128             1/3 16:00
5129             3/1
5130             3/1 16:00
5131             4:00
5132             17:00
5133             3:20:00
5134             -5min
5135             +2d
5136             20111018000000
5137             2016-06-19T12:12:11
5138              
5139             =head2 Aliases
5140              
5141             1 msec ago
5142             4 msecs ago
5143             1 sec ago
5144             10 secs ago
5145             1 min ago
5146             5 mins ago
5147             1 hr ago
5148             3 hrs ago
5149             1 yr ago
5150             7 yrs ago
5151             yesterday @ noon
5152             tues this week
5153             final thurs in sep
5154             tues
5155             thurs
5156             thur
5157              
5158             =head1 SEE ALSO
5159              
5160             L<DateTime::Format::Natural>
5161              
5162             =head1 AUTHOR
5163              
5164             Steven Schubiger <schubiger@cpan.org>
5165              
5166             =head1 LICENSE
5167              
5168             This program is free software; you may redistribute it and/or
5169             modify it under the same terms as Perl itself.
5170              
5171             See L<http://dev.perl.org/licenses/>
5172              
5173             =cut