在角色 Dateish 中§

有关方法 later 的主要文档,请参阅上下文

multi method later(DateTime:D: *%unit)

返回一个基于当前对象(属于混入此角色的任何类)的对象,但应用了时间增量。时间增量可以作为命名参数传递,其中参数名称是单位。

除非给定的单位是 secondseconds,否则给定的值将被转换为 Int

允许的单位有 secondsecondsminuteminuteshourhoursdaydaysweekweeksmonthmonthsyearyears。请注意,复数形式只能与 laterearlier 方法一起使用。

冒号对的 :2nd 形式可以作为一种紧凑且自文档化的方式来指定时间差。

say DateTime.new('2015-12-24T12:23:00Z').later(:2years);
# OUTPUT: «2017-12-24T12:23:00Z␤»

由于几个不同时间单位的加法不满足交换律,因此只能传递一个单位(并且将使用第一个多重单位)。

my $d = DateTime.new(date => Date.new('2015-02-27'));
say $d.later(month => 1).later(:2days);  # OUTPUT: «2015-03-29T00:00:00Z␤» 
say $d.later(days => 2).later(:1month);  # OUTPUT: «2015-04-01T00:00:00Z␤» 
say $d.later(days => 2).later(:month);   # same, as +True === 1

您还可以(自 Rakudo 编译器 2021.02 版本起)同时传递多个单位,但您必须将它们加入到 List 中以激活第二种形式。

say DateTime.new(date => Date.new('2015-02-27')).later( (:1month, :2days) )
# OUTPUT: «2015-03-29T00:00:00Z␤» 

如果结果时间的秒数值为 60,但该时间实际上不存在闰秒,则秒数将设置为 59

say DateTime.new('2008-12-31T23:59:60Z').later: :1day;
# OUTPUT: «2009-01-01T23:59:59Z␤»

允许负偏移量,但使用 earlier 更为惯用。

Date 类型的对象的行为方式相同。

my $d = Date.new('2015-02-27');
say $d.later(month => 1).later(:2days);  # OUTPUT: «2015-03-29␤» 
say $d.later(days => 2).later(:1month);  # OUTPUT: «2015-04-01␤» 
say $d.later(days => 2).later(:month);   # same, as +True === 1