Raku 包含几个处理时间信息的类:Date
、DateTime
、Instant
和 Duration
。前三个是日期类,因此它们混合了 Dateish
角色,该角色定义了处理日期的类应该假设的所有方法和属性。它还包括一个以 X::Temporal
为根的异常类层次结构。
我们将在下一个(稍微扩展的)示例中尝试说明这些类,该示例可用于处理目录(默认情况下为 .
)中具有特定扩展名(默认情况下为 .raku
)的所有文件,根据它们的年龄对它们进行排序,并计算每个月创建了多少个文件以及在以月范围表示的特定时间段内修改了多少个文件
sub MAIN( = ".", = "raku" )
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
,该范围不包含其最后一个元素。
此变量还用于计算文件修改的年份月份。很明显,Date
是 Dateish
,然后具有 month
方法来从中提取该属性。
Duration
对象可以进行比较。这在
.sort();
中用于按年龄对文件进行排序。