Raku 包含几个处理时间信息的类:DateDateTimeInstantDuration。前三个是日期类,因此它们混合了 Dateish 角色,该角色定义了处理日期的类应该假设的所有方法和属性。它还包括一个以 X::Temporal 为根的异常类层次结构。

我们将在下一个(稍微扩展的)示例中尝试说明这些类,该示例可用于处理目录(默认情况下为 .)中具有特定扩展名(默认情况下为 .raku)的所有文件,根据它们的年龄对它们进行排序,并计算每个月创建了多少个文件以及在以月范围表示的特定时间段内修改了多少个文件

sub MAIN$path = "."$extension = "raku" ) {
    my DateTime $right = DateTime.now;
    my %metadata;
    my %files-month;
    my %files-period;
    for dir($path).grep( / \.$extension $/ ) -> $file {
        CATCH {
            when X::Temporal { say "Date-related problem".payload }
            when X::IO { say "File-related problem".payload }
            default { .payload.say }
        }
        my Instant $modified = $file.modified;
        my Instant $accessed = $file.accessed;
        my Duration $duration = $accessed - $modified;
        my $age = $right - DateTime($accessed);
        my $time-of-day = $file.changed.DateTime.hh-mm-ss but Dateish;
        my $file-changed-date =  $file.changed.Date;
        %metadata{$file} = %modified => $modified,
                              accessed => $accessed,
                              age => $age,
                              difference => $duration,
                              changed-tod => $time-of-day,
                              changed-date => $file-changed-date);
        %files-month{$file-changed-date.month}++;
        given $file-changed-date {
            when Date.new("2018-01-01")..^Date.new("2018-04-01"{ %files-period<pre-grant>++}
            when Date.new("2018-04-01")..Date.new("2018-05-31"{ %files-period<grant>++}
            default { %files-period<post-grant>++};
        }
    }
 
    %metadata.sort{ $^a.value<age> <=> $^b.value<age> } ).map: {
        say $^x.key"",
        $^x.value<accessed modified age difference changed-tod changed-date>.join("");
    };
    %files-month.keys.sort.map: {
        say "Month $^x → %files-month{$^x}"
    };
 
    %files-period.keys.map: {
        say "Period $^x → %files-period{$^x}"
    };
}

DateTime 在第 2 行中用于存储由 now 返回的当前日期和时间。

在第 7 到 11 行中声明了一个 CATCH 阶段。它的主要任务是区分 DateTime 相关的异常和其他类型的异常。这些类型的异常可能来自 无效格式时区冲突。除了文件属性的损坏,这两种情况都是不可能的,但无论如何,它们都应该被捕获并与其他类型的异常分开。

我们在第 12-13 行中使用 Instant 来表示文件被访问和修改的时刻。Instant 以原子秒为单位进行测量,是对时间事件的非常底层的描述;然而,在第 14 行中声明的 Duration 表示两个不同 Instant 之间经过的时间,我们将使用它来表示年龄。

对于某些变量,我们可能对使用一些“日期化”特征来处理它们感兴趣。$time-of-day 包含文件更改的当天时间;changed 将返回一个 Instant,但它被转换为 Date(它是 Dateish,而 Instant 不是),然后从该 Date 中提取当天时间。$time-of-day 将具有 «Str+{Dateish}␤» 类型。

我们将使用此变量中的日期来找出文件更改的时期。

Date.new("2018-01-01")..^Date.new("2018-04-01")

创建一个日期 Range,并且 $file-changed-date 与其进行智能匹配。日期可以以这种方式使用;在本例中,它创建一个 Range,该范围不包含其最后一个元素。

此变量还用于计算文件修改的年份月份。很明显,DateDateish,然后具有 month 方法来从中提取该属性。

Duration 对象可以进行比较。这在

%metadata.sort({
    $^a.value<age> <=> $^b.value<age>
});

中用于按年龄对文件进行排序。