在这种情况下,我可以找到定义,但我不太掌握它。来自官方文档:
瞬间是以原子秒为单位的特定时刻,带有分数。它与任何时代无关或意识到任何时代。
我不明白你怎么能在没有纪元的情况下指定一个特定的时刻?它没有参考点吗?在两台不同的Linux机器上,似乎两个Instants都指的是自POSIX Epoch以来的秒数。我的猜测是,即时确实有一个有效的开始时间,但开始时间取决于实现/设备。
# machine1
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748226200715
# machine2
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748712024946
无论如何,所以我的问题是,是否可以依靠即时在不同流程之间保持一致,或者它们仅用于"内部"使用?
say (now).WHAT; # «(Instant)»
say (now * 1).WHAT # «(Num)»
任何数字运算符都会将其操作数强制为 Num
s。如果您想要正确的字符串表示形式,请使用 .perl
。
say (now).perl # «Instant.from-posix((<1211194481492/833>, 0))»
无论您在哪个平台上,Instant.from-posix
都将始终与Unix时代有关。
参见:https://github.com/rakudo/rakudo/blob/nom/src/core/Instant.pm#L15
当前特定计算机上的所有即时对象都是可比的,来自不同机器的即时可能不是。
出于实际目的,在 POSIX 机器上,它目前基于自 1970 年 1 月 1 日以来根据国际原子时 (TAI) 的秒数,目前比协调世界时 (UTC) 早 36 秒。
(即使您知道您的代码只能在 POSIX 机器上运行,也不应依赖这一点)
在另一个系统上,基于计算机打开以来的时间量可能更有意义。
因此,重新启动后,重新启动之前的任何 Instant 都无法与重新启动后的任何 Instant 进行比较。
如果要比较不同机器的时刻,或存储它们以供以后使用,请将其转换为标准化值。
您可以使用几种内置转换器
# runtime constant-like term
my init = INIT now;
say init.to-posix.perl;
# (1454172565.36938, Bool::False)
say init.DateTime.Str; # now.DateTime =~= DateTime.now
# 2016-01-30T16:49:25.369380Z
say init.Date.Str; # now.Date =~= Date.today
# 2016-01-30
say init.DateTime.yyyy-mm-dd eq init.Date.Str;
# True
如果您需要的不仅仅是上面显示的内容,我建议您只使用 DateTime 对象,因为它具有各种有用的方法。
my $now = DateTime.now;
say $now.Str;
# 2016-01-30T11:29:14.928520-06:00
say $now.truncated-to('day').utc.Str;
# 2016-01-30T06:00:00Z
# ^
say $now.utc.truncated-to('day').Str;
# 2016-01-30T00:00:00Z
# ^
Date.today
和DateTime.now
考虑您当地的时区信息,而now.Date
和now.DateTime
则不能。
如果你真的只想处理POSIX次,你可以使用time
,它与now.to-posix[0].Int
大致相同。