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   3336 use strict;
  26         126  
  26         1261  
4 26     26   148 use warnings;
  26         56  
  26         2037  
5 26     26   169 use base qw(DateTime::Format::Natural::Lang::Base);
  26         56  
  26         14606  
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   196 use constant true => 1;
  26         58  
  26         2225  
11 26     26   167 use constant false => 0;
  26         147  
  26         1489  
12 26     26   177 use constant skip => true;
  26         104  
  26         1483  
13 26     26   217 use constant milli_to_nano => 1_000_000;
  26         56  
  26         1659  
14              
15 26     26   258 use DateTime::Format::Natural::Helpers qw(%flag);
  26         118  
  26         733647  
16              
17             our $VERSION = '1.75';
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}(?:\2\d{2}(?:\.\d{3})?)?)?)/,
51             time_am => qr/((?:\d{1,2})(?:([:\.])\d{2}(?:\2\d{2}(?:\.\d{3})?)?)?)a\.?m\.?/i,
52             time_pm => qr/((?:\d{1,2})(?:([:\.])\d{2}(?:\2\d{2}(?:\.\d{3})?)?)?)p\.?m\.?/i,
53             time_min => qr/(\d{1,2}([:\.])\d{2}(?:\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*?(?:a\.?m\.?|p\.?m\.?))/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             begin_end_month_ago => [
4722             [ 'SCALAR', 'SCALAR', 'REGEXP', 'REGEXP', 'SCALAR' ],
4723             [
4724             { 0 => 'beginning', 1 => 'of', 2 => $RE{number}, 3 => qr/^(months?)$/i, 4 => 'ago' },
4725             [ [ 2, 3 ] ],
4726             [ $extended_checks{suffix} ],
4727             [
4728             [ 2 ],
4729             [
4730             { VALUE => 1 },
4731             ],
4732             ],
4733             [ { unit => 'month' }, {} ],
4734             [ '_ago_variant', '_begin_end_month' ],
4735             { truncate_to => [q(day)] },
4736             ],
4737             [
4738             { 0 => 'end', 1 => 'of', 2 => $RE{number}, 3 => qr/^(months?)$/i, 4 => 'ago' },
4739             [ [ 2, 3 ] ],
4740             [ $extended_checks{suffix} ],
4741             [
4742             [ 2 ],
4743             [
4744             { VALUE => undef },
4745             ],
4746             ],
4747             [ { unit => 'month' }, {} ],
4748             [ '_ago_variant', '_begin_end_month' ],
4749             { truncate_to => [q(day)] },
4750             ],
4751             ],
4752             begin_end_this_month => [
4753             [ 'SCALAR', 'SCALAR', 'SCALAR', 'SCALAR' ],
4754             [
4755             { 0 => 'beginning', 1 => 'of', 2 => 'this', 3 => 'month' },
4756             [],
4757             [],
4758             [
4759             [
4760             { VALUE => 1 },
4761             ],
4762             ],
4763             [ {} ],
4764             [ '_begin_end_month' ],
4765             { truncate_to => [q(day)] },
4766             ],
4767             [
4768             { 0 => 'end', 1 => 'of', 2 => 'this', 3 => 'month' },
4769             [],
4770             [],
4771             [
4772             [
4773             { VALUE => undef },
4774             ],
4775             ],
4776             [ {} ],
4777             [ '_begin_end_month' ],
4778             { truncate_to => [q(day)] },
4779             ],
4780             ],
4781             begin_end_month_from_now => [
4782             [ 'SCALAR', 'SCALAR', 'REGEXP', 'REGEXP', 'REGEXP', 'SCALAR' ],
4783             [
4784             { 0 => 'beginning', 1 => 'of', 2 => $RE{number}, 3 => qr/^(months?)$/i, 4 => qr/^(from)$/i, 5 => 'now' },
4785             [ [ 2, 3 ] ],
4786             [ $extended_checks{suffix} ],
4787             [
4788             [
4789             2,
4790             { 4 => [ $flag{before_after_from} ] },
4791             ],
4792             [
4793             { VALUE => 1 },
4794             ],
4795             ],
4796             [ { unit => 'month' }, {} ],
4797             [ '_now_variant', '_begin_end_month' ],
4798             { truncate_to => [q(day)] },
4799             ],
4800             [
4801             { 0 => 'end', 1 => 'of', 2 => $RE{number}, 3 => qr/^(months?)$/i, 4 => qr/^(from)$/i, 5 => 'now' },
4802             [ [ 2, 3 ] ],
4803             [ $extended_checks{suffix} ],
4804             [
4805             [
4806             2,
4807             { 4 => [ $flag{before_after_from} ] },
4808             ],
4809             [
4810             { VALUE => undef },
4811             ],
4812             ],
4813             [ { unit => 'month' }, {} ],
4814             [ '_now_variant', '_begin_end_month' ],
4815             { truncate_to => [q(day)] },
4816             ],
4817             ],
4818             );
4819              
4820             1;
4821             __END__
4822              
4823             =head1 NAME
4824              
4825             DateTime::Format::Natural::Lang::EN - English language metadata
4826              
4827             =head1 DESCRIPTION
4828              
4829             C<DateTime::Format::Natural::Lang::EN> provides the english specific grammar
4830             and variables. This class is loaded if the user either specifies the english
4831             language or implicitly.
4832              
4833             =head1 EXAMPLES
4834              
4835             Below are some examples of natural language date/time input in english (be aware
4836             that the parser does usually not distinguish between lower/upper case; furthermore,
4837             many expressions allow for additional leading/trailing time and all times are
4838             also parsable with precision in (milli)seconds):
4839              
4840             =head2 Simple
4841              
4842             now
4843             yesterday
4844             today
4845             tomorrow
4846             morning
4847             afternoon
4848             evening
4849             noon
4850             midnight
4851             yesterday at noon
4852             yesterday at midnight
4853             today at noon
4854             today at midnight
4855             tomorrow at noon
4856             tomorrow at midnight
4857             this morning
4858             this afternoon
4859             this evening
4860             yesterday morning
4861             yesterday afternoon
4862             yesterday evening
4863             today morning
4864             today afternoon
4865             today evening
4866             tomorrow morning
4867             tomorrow afternoon
4868             tomorrow evening
4869             thursday morning
4870             thursday afternoon
4871             thursday evening
4872             6:00 yesterday
4873             6:00 today
4874             6:00 tomorrow
4875             5am yesterday
4876             5am today
4877             5am tomorrow
4878             4pm yesterday
4879             4pm today
4880             4pm tomorrow
4881             last millisecond
4882             this millisecond
4883             next millisecond
4884             last second
4885             this second
4886             next second
4887             last minute
4888             this minute
4889             next minute
4890             last hour
4891             this hour
4892             next hour
4893             last day
4894             this day
4895             next day
4896             last week
4897             this week
4898             next week
4899             last month
4900             this month
4901             next month
4902             last quarter
4903             this quarter
4904             next quarter
4905             last year
4906             this year
4907             next year
4908             last friday
4909             this friday
4910             next friday
4911             tuesday last week
4912             tuesday this week
4913             tuesday next week
4914             last week wednesday
4915             this week wednesday
4916             next week wednesday
4917             10 milliseconds ago
4918             10 seconds ago
4919             10 minutes ago
4920             10 hours ago
4921             10 days ago
4922             10 weeks ago
4923             10 months ago
4924             10 years ago
4925             in 5 milliseconds
4926             in 5 seconds
4927             in 5 minutes
4928             in 5 hours
4929             in 5 days
4930             in 5 weeks
4931             in 5 months
4932             in 5 years
4933             saturday
4934             sunday 11:00
4935             yesterday at 4:00
4936             today at 4:00
4937             tomorrow at 4:00
4938             yesterday at 6:45am
4939             today at 6:45am
4940             tomorrow at 6:45am
4941             yesterday at 6:45pm
4942             today at 6:45pm
4943             tomorrow at 6:45pm
4944             yesterday at 2:32 AM
4945             today at 2:32 AM
4946             tomorrow at 2:32 AM
4947             yesterday at 2:32 PM
4948             today at 2:32 PM
4949             tomorrow at 2:32 PM
4950             yesterday 02:32
4951             today 02:32
4952             tomorrow 02:32
4953             yesterday 2:32am
4954             today 2:32am
4955             tomorrow 2:32am
4956             yesterday 2:32pm
4957             today 2:32pm
4958             tomorrow 2:32pm
4959             wednesday at 14:30
4960             wednesday at 02:30am
4961             wednesday at 02:30pm
4962             wednesday 14:30
4963             wednesday 02:30am
4964             wednesday 02:30pm
4965             friday 03:00 am
4966             friday 03:00 pm
4967             sunday at 05:00 am
4968             sunday at 05:00 pm
4969             2nd monday
4970             100th day
4971             4th february
4972             november 3rd
4973             last june
4974             next october
4975             6 am
4976             5am
4977             5:30am
4978             8 pm
4979             4pm
4980             4:20pm
4981             06:56:06 am
4982             06.56.06 am
4983             06:56:06 pm
4984             06.56.06 pm
4985             mon 2:35
4986             1:00 sun
4987             1am sun
4988             1pm sun
4989             1:00 on sun
4990             1am on sun
4991             1pm on sun
4992             12:14 PM
4993             12.14 P.M.
4994             12.14 P.M
4995             12:14 AM
4996             12:14 A.M.
4997             12:14 A.M
4998              
4999             =head2 Complex
5000              
5001             yesterday 7 milliseconds ago
5002             yesterday 7 seconds ago
5003             yesterday 7 minutes ago
5004             yesterday 7 hours ago
5005             yesterday 7 days ago
5006             yesterday 7 weeks ago
5007             yesterday 7 months ago
5008             yesterday 7 years ago
5009             today 5 milliseconds ago
5010             today 5 seconds ago
5011             today 5 minutes ago
5012             today 5 hours ago
5013             today 5 days ago
5014             today 5 weeks ago
5015             today 5 months ago
5016             today 5 years ago
5017             tomorrow 3 milliseconds ago
5018             tomorrow 3 seconds ago
5019             tomorrow 3 minutes ago
5020             tomorrow 3 hours ago
5021             tomorrow 3 days ago
5022             tomorrow 3 weeks ago
5023             tomorrow 3 months ago
5024             tomorrow 3 years ago
5025             2 milliseconds before now
5026             2 seconds before now
5027             2 minutes before now
5028             2 hours before now
5029             2 days before now
5030             2 weeks before now
5031             2 months before now
5032             2 years before now
5033             4 milliseconds from now
5034             4 seconds from now
5035             4 minutes from now
5036             4 hours from now
5037             4 days from now
5038             4 weeks from now
5039             4 months from now
5040             4 years from now
5041             6 in the morning
5042             4 in the afternoon
5043             9 in the evening
5044             monday 6 in the morning
5045             monday 4 in the afternoon
5046             monday 9 in the evening
5047             last sunday at 21:45
5048             monday last week
5049             6th day last week
5050             6th day this week
5051             6th day next week
5052             12th day last month
5053             12th day this month
5054             12th day next month
5055             1st day last year
5056             1st day this year
5057             1st day next year
5058             1st tuesday last november
5059             1st tuesday this november
5060             1st tuesday next november
5061             11 january next year
5062             11 january this year
5063             11 january last year
5064             6 milliseconds before yesterday
5065             6 seconds before yesterday
5066             6 minutes before yesterday
5067             6 hours before yesterday
5068             6 milliseconds before today
5069             6 seconds before today
5070             6 minutes before today
5071             6 hours before today
5072             6 milliseconds before tomorrow
5073             6 seconds before tomorrow
5074             6 minutes before tomorrow
5075             6 hours before tomorrow
5076             3 milliseconds after yesterday
5077             3 seconds after yesterday
5078             3 minutes after yesterday
5079             3 hours after yesterday
5080             3 milliseconds after today
5081             3 seconds after today
5082             3 minutes after today
5083             3 hours after today
5084             3 milliseconds after tomorrow
5085             3 seconds after tomorrow
5086             3 minutes after tomorrow
5087             3 hours after tomorrow
5088             10 milliseconds before noon
5089             10 seconds before noon
5090             10 minutes before noon
5091             10 hours before noon
5092             10 milliseconds before midnight
5093             10 seconds before midnight
5094             10 minutes before midnight
5095             10 hours before midnight
5096             5 milliseconds after noon
5097             5 seconds after noon
5098             5 minutes after noon
5099             5 hours after noon
5100             5 milliseconds after midnight
5101             5 seconds after midnight
5102             5 minutes after midnight
5103             5 hours after midnight
5104             noon last friday
5105             midnight last friday
5106             noon this friday
5107             midnight this friday
5108             noon next friday
5109             midnight next friday
5110             last friday at 20:00
5111             this friday at 20:00
5112             next friday at 20:00
5113             1:00 last friday
5114             1:00 this friday
5115             1:00 next friday
5116             1am last friday
5117             1am this friday
5118             1am next friday
5119             1pm last friday
5120             1pm this friday
5121             1pm next friday
5122             5 am last monday
5123             5 am this monday
5124             5 am next monday
5125             5 pm last monday
5126             5 pm this monday
5127             5 pm next monday
5128             last wednesday 7am
5129             this wednesday 7am
5130             next wednesday 7am
5131             last wednesday 7pm
5132             this wednesday 7pm
5133             next wednesday 7pm
5134             last tuesday 11 am
5135             this tuesday 11 am
5136             next tuesday 11 am
5137             last tuesday 11 pm
5138             this tuesday 11 pm
5139             next tuesday 11 pm
5140             yesterday at 13:00
5141             today at 13:00
5142             tomorrow at 13
5143             2nd friday in august
5144             3rd wednesday in november
5145             tomorrow 1 year ago
5146             saturday 3 months ago at 17:00
5147             saturday 3 months ago at 5:00am
5148             saturday 3 months ago at 5:00pm
5149             11 january 2 years ago
5150             4th day last week
5151             8th month last year
5152             8th month this year
5153             8th month next year
5154             6 mondays from now
5155             fri 3 months ago at 5am
5156             wednesday 1 month ago at 8pm
5157             final thursday in april
5158             last thursday in april
5159             beginning of last month
5160             end of last month
5161             beginning of 3 months ago
5162             end of 3 months ago
5163             beginning of this month
5164             end of this month
5165             beginning of 3 months from now
5166             end of 3 months from now
5167              
5168             =head2 Timespans
5169              
5170             monday to friday
5171             1 April to 31 August
5172             1999-12-31 to tomorrow
5173             now to 2010-01-01
5174             2009-03-10 9:00 to 11:00
5175             26 oct 10:00 am to 11:00 am
5176             jan 1 to 2
5177             16:00 nov 6 to 17:00
5178             may 2nd to 5th
5179             100th day to 200th
5180             6am dec 5 to 7am
5181             30th to 31st dec
5182             30th to dec 31st
5183             21:00 to mar 3 22:00
5184             21:00 to 22:00 mar 3
5185             10th to 20th day
5186             1/3 to 2/3
5187             2/3 to in 1 week
5188             3/3 21:00 to in 5 days
5189             first day of 2009 to last day of 2009
5190             first day of may to last day of may
5191             first to last day of 2008
5192             first to last day of september
5193             for 4 milliseconds
5194             for 4 seconds
5195             for 4 minutes
5196             for 4 hours
5197             for 4 days
5198             for 4 weeks
5199             for 4 months
5200             for 4 years
5201              
5202             =head2 Specific
5203              
5204             march
5205             january 11
5206             11 january
5207             18 oct 17:00
5208             18 oct 5am
5209             18 oct 5pm
5210             18 oct 5 am
5211             18 oct 5 pm
5212             dec 25
5213             feb 28 3:00
5214             feb 28 3.00 pm
5215             feb 28 3.00 p.m.
5216             feb 28 3.00.15 a.m
5217             feb 28 3am
5218             feb 28 3pm
5219             feb 28 3 am
5220             feb 28 3 pm
5221             19:00 jul 1
5222             7am jul 1
5223             7pm jul 1
5224             7 am jul 1
5225             7 pm jul 1
5226             jan 24, 2011 12:00
5227             jan 24, 2011 12am
5228             jan 24, 2011 12pm
5229             may 27th
5230             2005
5231             march 1st 2009
5232             October 2006
5233             february 14, 2004
5234             Nov 24th 2006 17.00.00
5235             jan 3 2010
5236             3 jan 2000
5237             2010 october 28
5238             2011-jan-04
5239             27/5/1979
5240             1/3
5241             1/3 16:00
5242             3/1
5243             3/1 16:00
5244             4:00
5245             17:00
5246             17.00
5247             3:20:00
5248             -5min
5249             +2d
5250             20111018000000
5251             2016-06-19T12:12:11
5252             2016-06-19T12:12:11Z
5253             2016-06-19T12:12:11-05
5254             2016-06-19T12:12:11-0500
5255             2016-06-19T12:12:11-05:00
5256             2016-06-19T12:12:11+05:00
5257             2016-06-19T12:12+05:00
5258              
5259             =head2 Aliases
5260              
5261             1 msec ago
5262             4 msecs ago
5263             1 sec ago
5264             10 secs ago
5265             1 min ago
5266             5 mins ago
5267             1 hr ago
5268             3 hrs ago
5269             1 yr ago
5270             7 yrs ago
5271             yesterday @ noon
5272             tues this week
5273             final thurs in sep
5274             tues
5275             thurs
5276             thur
5277              
5278             =head1 SEE ALSO
5279              
5280             L<DateTime::Format::Natural>
5281              
5282             =head1 AUTHOR
5283              
5284             Steven Schubiger <schubiger@cpan.org>
5285              
5286             =head1 LICENSE
5287              
5288             This program is free software; you may redistribute it and/or
5289             modify it under the same terms as Perl itself.
5290              
5291             See L<http://dev.perl.org/licenses/>
5292              
5293             =cut