是否所有Instants都与Perl 6中的机器相关?

时间:2016-01-28 20:10:42

标签: perl6

这是我可以找到定义的情况,但我不太了解它。来自official documentation

  

瞬发是以原子秒为单位测量的特定时刻,包含分数。它与任何时代无关或不了解。

我不明白如何在没有纪元的情况下指定特定时刻?它没有参考点吗?在两台不同的Linux机器上,似乎两个Instants都提到自POSIX Epoch以来的几秒钟。我的猜测是Instants确实有一个有效的开始时间,但是开始时间是依赖于实现/设备的。

# 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

无论如何,我的问题是,可以依赖Instants在不同进程之间保持一致,还是只用于“内部”使用?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

当前在特定计算机上的所有Instant对象都是可比较的,来自不同计算机的Instants可能不是。

出于实际目的,在POSIX机器上,它目前基于1970年1月1日以来的秒数,根据International Atomic Time (TAI),目前36 seconds Coordinated Universal Time (UTC)之前的{{3}}。 /> (即使您知道您的代码只能在POSIX机器上运行,也不应该依赖它)

在另一个系统上,根据机器开启后的时间量,它可能更有意义 因此,重新启动后,重启之前的任何Instants将无法与之后的任何Instants进行比较。

如果您想比较不同机器的Instants,或将它们存储起来供以后使用,请将其转换为标准值。

您可以使用几种内置转换器

# 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