在 Perl 6 中,所有的即时状态都是可比的,还是依赖于机器的?

  • 本文关键字:机器 依赖于 Perl 状态 raku
  • 更新时间 :
  • 英文 :


在这种情况下,我可以找到定义,但我不太掌握它。来自官方文档:

瞬间是以原子秒为单位的特定时刻,带有分数。它与任何时代无关或意识到任何时代。

我不明白你怎么能在没有纪元的情况下指定一个特定的时刻?它没有参考点吗?在两台不同的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.todayDateTime.now考虑您当地的时区信息,而now.Datenow.DateTime则不能。


如果你真的只想处理POSIX次,你可以使用time,它与now.to-posix[0].Int大致相同。

最新更新