Rand Stats

DateTime::Grammar

zef:antononcube

DateTime::Grammar Raku package

Introduction

This Raku package provides grammar (role) and interpreters for parsing datetime specifications.

Most of the code is from [FS1]. The original code of the file "Parse.rakumod" (from [FS1]) was separated into the files "Grammarish.rakumod" and "Actions/Raku.rakumod".

The code in "Grammar.rakumod" provides the "top-level" functions:

Remark: The code DateTime::Parse.new can be replaced with datetime-interpret. Compare the test files of this repository that have names starting with "01-" with the corresponding files in [FS1].


Installation

From Zef ecosystem:

zef install DateTime::Grammar

From GitHub:

zef install https://github.com/antononcube/Raku-DateTime-Grammar.git

Usage examples

Interpret a full blown datetime spec:

use DateTime::Grammar;
my $rfc1123 = datetime-interpret('Sun, 06 Nov 1994 08:49:37 GMT');
$rfc1123.raku
# DateTime.new(1994,11,6,8,49,37)

Just the date:

$rfc1123.Date;
# 1994-11-06

7th day of week:

datetime-interpret('Sun', :rule<wkday>) + 1;
# 7

With the adverb extended we can control whether the datetime specs can be just dates. Here are examples:

datetime-interpret('1/23/1089'):extended;
# 1089-01-23T00:00:00Z
datetime-interpret('1/23/1089'):!extended;
# (Any)

Using the role in "external" grammars

Here is how the role "Grammarish" of "DateTime::Grammar" can be used in "higher order" grammars:

my grammar DateTimeInterval 
    does DateTime::Grammarish {

    rule TOP($*extended) { 'from' <from=.datetime-param-spec> 'to' <to=.datetime-param-spec> } 
};

DateTimeInterval.parse('from 2022-12-02 to Oct 4 2023', args => (True,))
# 「from 2022-12-02 to Oct 4 2023」
#  from => 「2022-12-02」
#   date-spec => 「2022-12-02」
#    date5 => 「2022-12-02」
#     year => 「2022」
#     month => 「12」
#     day => 「02」
#  to => 「Oct 4 2023」
#   date-spec => 「Oct 4 2023」
#    date8 => 「Oct 4 2023」
#     month => 「Oct」
#      month-short-name => 「Oct」
#     day => 「4」
#     year => 「2023」

The parameter $*extended can be eliminated by using <datetime-spec> instead of <datetime-param-spec>:

my grammar DateTimeInterval2 
    does DateTime::Grammarish {

    rule TOP { 'from' <from=.datetime-spec> 'to' <to=.datetime-spec> } 
};

DateTimeInterval2.parse('from 2022-12-02 to Oct 4 2023')
# 「from 2022-12-02 to Oct 4 2023」
#  from => 「2022-12-02」
#   date-spec => 「2022-12-02」
#    date5 => 「2022-12-02」
#     year => 「2022」
#     month => 「12」
#     day => 「02」
#  to => 「Oct 4 2023」
#   date-spec => 「Oct 4 2023」
#    date8 => 「Oct 4 2023」
#     month => 「Oct」
#      month-short-name => 「Oct」
#     day => 「4」
#     year => 「2023」

CLI

The package provides a Command Line Interface (CLI) script. Here is its usage message:

datetime-interpretation --help
# Usage:
#   datetime-interpretation <spec> [-t|--target=<Str>] -- Interpret datetime spec.
#   datetime-interpretation [<words> ...] [-t|--target=<Str>] -- Interpret datetime spec obtained by a sequence of strings.
#   datetime-interpretation [-t|--target=<Str>] -- Interpret datetime spec from pipeline input
#   
#     <spec>               Datetime specification.
#     -t|--target=<Str>    Interpretation target. [default: 'Raku']
#     [<words> ...]        Datetime specification.

References

[FPS1] Filip Sergot, DateTime::Parse Raku package, (2017-2022), GitHub/sergot.