is Cool does Real
Instant
是时间中的特定时刻,以原子秒为单位进行测量,带分数。它不与任何纪元相关联或感知任何纪元。
Instant
可用于创建设置为该 Instant
的 DateTime
对象。伪常量 now
将当前时间作为 Instant
返回。
为 Instant
(以及 Duration
)定义了基本数学运算。将 Instant
添加到 Duration
会返回另一个 Instant。减去两个 Instant
将产生一个 Duration
。明确禁止添加两个 Instant
。所有其他使用 Instant 的运算都是未定义的。
未来的闰秒§
涉及闰秒知识的方法总是假设在实现知道的最后一个闰秒之后不会再有闰秒,这可能不是实际安排的最后一个闰秒。这意味着根据你使用的编译器版本,你可能会得到不同的结果。例如,2016 年 12 月 31 日的闰秒在 7 月份宣布,并随 Rakudo 2016.07 一起发布,因此 2016.06 及更早版本不会知道它。
$ perl6-2016.06 -e 'say Instant.from-posix: 1485726595' Instant:1485726631 $ perl6-2016.07 -e 'say Instant.from-posix: 1485726595' Instant:1485726632
由于 Rakudo 编译器始终为其不知道的未来闰秒返回 0,因此当宣布新的闰秒时,你可以修补旧代码,这样它将给出正确的结果,无论它运行在哪个版本的编译器上
$ perl6-2016.06 -e 'say ($*VM.version before v2016.07 ?? 1 !! 0) + Instant.from-posix: 1485726595' Instant:1485726632 $ perl6-2016.07 -e 'say ($*VM.version before v2016.07 ?? 1 !! 0) + Instant.from-posix: 1485726595' Instant:1485726632
这些示例需要早于重命名的编译器,因此仍然引用 perl6。
方法§
方法 from-posix§
method from-posix(, Bool = False)
将 POSIX 时间戳 $posix
转换为 Instant。如果 $prefer-leap-second
为 True
,则返回值将是闰秒情况下可能的两个秒中的第一个。
say DateTime.new(Instant.from-posix(915148800, True)); # OUTPUT: «1998-12-31T23:59:60Z»say DateTime.new(Instant.from-posix(915148800)); # OUTPUT: «1999-01-01T00:00:00Z»
方法 to-posix§
method to-posix()
将调用者转换为 POSIX 时间戳,并返回一个包含 POSIX 时间戳和 Bool
的两元素列表。它是 方法 from-posix 的逆,但第二个返回值为 True
当且仅当此 Instant 处于闰秒时。
say DateTime.new("1999-01-01T00:00:00Z").Instant.to-posix; # OUTPUT: «(915148800 False)»say DateTime.new('1998-12-31T23:59:60Z').Instant.to-posix; # OUTPUT: «(915148800 True)»
方法 Date§
method Date(Instant: --> Date)
将调用者强制转换为 Date
。
my = "/etc/passwd".IO.modified;say ; # OUTPUT: «Instant:1451489025.878018»say .Date; # OUTPUT: «2015-12-30»
方法 DateTime§
method DateTime(Instant: --> DateTime)
将调用者强制转换为 DateTime
。
say now.DateTime; # OUTPUT: «2017-05-09T14:02:58.147165Z»